{}에 대한 대체 정규식

{}에 대한 대체 정규식

이 줄을 모두 바꾸려고 하는데 숫자가 다음과 같습니다.

looktype="123"

그래서 숫자만 나타납니다.

이것이 쉬운 방법으로 가능합니까?

{sub ("look type=\"[0-9]{0,3}", "TEST")}

나는 이것을 시도하고 있지만 awk아무 소용이 없습니다. "sub"와 {0, 3}이 방해하고 있다고 생각합니다.

답변1

~ 안에확장 정규식(ERE)는 및 시간 사이에 반복됨을 의미합니다 . Awk는 확장 정규식을 구현하지만, awk의 역사적 구현에는 반복 간격에 대한 이 중괄호 구문이 없었습니다. 그만큼X{m,n}XmnPOSIX 표준awk가 ERE를 지원해야 한다고 지정하지만 현존하는 많은 구현은 이를 준수하지 않습니다.

GNU awk를 사용하면,간격버전 4.0부터만 지원됩니다. 이전 버전에서는 POSIXLY_CORRECT환경 변수를 비어 있지 않은 값으로 설정하여 gawk가 POSIX를 준수하도록 강제할 수 있습니다 .

POSIXLY_CORRECT=1 awk '{sub ("looktype=\"[0-9]{0,3}", "TEST"); print}'

일부 배포판에서 awk의 기본 버전은 gawk가 아니라 더 작고 빠른 mawk입니다. Mawk는 중괄호 표현식을 지원하지 않습니다.해당 패치가 있습니다, 그러나 mawk는 유지 관리되지 않기 때문에 널리 채택되지 않습니다.

반복 횟수가 작으면 다음과 같이 철자할 수 있습니다.

awk '{sub ("looktype=\"[0-9]?[0-9]?[0-9]?[0-9]?", "TEST"); print}'

답변2

파이프를 통해 sed따옴표 안에 있는 내용만 추출할 수 있습니다.

예를 들어

$ echo 'looktype="123"' | sed -r -e 's/^.*"([^"]+)".*/\1/'
123

이는 -rGNU sed에만 해당되며 sed에게 기본 정규식 대신 확장된 정규식을 사용하도록 지시합니다. 다른 버전에는 sed이 기능이 없거나 대신 사용할 수 있습니다 -E. 그렇지 않으면 POSIX 기본 정규식(BRE)에 다음과 같이 작성합니다.

sed -e 's/^.*"\([^"][^"]*\)".*/\1/'

답변3

에서 awk(가정정확한귀하가 게시한 입력) 다음과 같이 할 수도 있습니다.

awk -F'=' '{print $2}' | sed 's/"//g'

답변4

GNU의 대안 grep(Ubuntu 태그 때문에 가지고 있다고 가정합니다):

grep -o '[0-9]\+' your_file

Perl을 사용한 훨씬 더 이식성이 뛰어난 대안

perl -nle '/([0-9]+)/ and print $1' your_file

두 가지 대안은 정확히 동일하지 않습니다. 같은 줄에 숫자 문자열의 인스턴스가 여러 개 있으면 다르게 동작합니다. 이 grep명령문은 별도의 줄에 나타나는 모든 숫자를 인쇄하는 반면, 명령문 perl은 각 줄에서 가장 왼쪽에 나타나는 숫자 문자열만 인쇄합니다. 이는 Perl과 정규식 엔진의 내부 구현 차이 때문입니다 grep.

관련 정보