
이 줄을 모두 바꾸려고 하는데 숫자가 다음과 같습니다.
looktype="123"
그래서 숫자만 나타납니다.
이것이 쉬운 방법으로 가능합니까?
{sub ("look type=\"[0-9]{0,3}", "TEST")}
나는 이것을 시도하고 있지만 awk
아무 소용이 없습니다. "sub"와 {0, 3}이 방해하고 있다고 생각합니다.
답변1
~ 안에확장 정규식(ERE)는 및 시간 사이에 반복됨을 의미합니다 . Awk는 확장 정규식을 구현하지만, awk의 역사적 구현에는 반복 간격에 대한 이 중괄호 구문이 없었습니다. 그만큼X{m,n}
X
m
n
POSIX 표준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
이는 -r
GNU 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
.