{}에 대한 대체 정규 표현식

{}에 대한 대체 정규 표현식

이 줄의 숫자만 제외하고 모두 바꾸려고 합니다.

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환경 변수를 null이 아닌 값으로 설정하여 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.

관련 정보