이름에 "/"가 포함된 줄 사이의 줄을 인쇄해야 합니다. 나는 이전에 시도했습니다:
awk '/+SOLUTION/ESTIMATES/,/-SOLUTION/ESTIMATES/' $F > fil$F
그리고
awk '/+SOLUTION"/"ESTIMATES/,/-SOLUTION"/"ESTIMATES/' $F > fil$F
그리고
awk '/"{+SOLUTION/ESTIMATES}"/,/"{-SOLUTION/ESTIMATES}"/' $F > fil$F
그러나 오류는 항상 "종료되지 않은 문자열"과 거의 동일합니다.
이 패턴 사이의 선을 어떻게 인쇄할 수 있나요?
답변1
/regex/
yes의 약어 $0 ~ /regex/
는 로도 쓸 수 있으니 $0 ~ "regex"
이외에/
접두사를 추가하여 이스케이프하세요.\
또는\octal
문자 값과 함께 사용됩니다 /
( \57
ASCII 기반 시스템, EBCDIC 기반 시스템 등).\141
, 다음을 수행할 수도 있습니다.
awk '$0 ~ "\\+SOLUTION/ESTIMATES", $0 ~ "-SOLUTION/ESTIMATES"' < "$F" > "fil$F"
+
확장된 정규식 연산자이므로 or 로 이스케이프 해야 \+
합니다 [+]
. \
의 구문에서도 특별한 의미를 갖기 때문에 a를 정규식 엔진에 전달하기 "strings"
위해 두 배로 늘리는 것이 좋습니다 . \
일부 awk
구현을 사용하면 문제를 해결할 수 있지만 "\+"
전부는 아닙니다.
가능하다면 파일 경로를 인수로 전달하는 것보다 리디렉션을 사용하는 것이 더 좋습니다. 이렇게 하면 또는 포함(또는 이전 버전의 busybox에서는 다음으로 시작 ) 과 같은 값이 awk
차단됩니다 . 또한 매개변수를 인용하는 것을 잊었으므로 분할+글로브의 영향을 받습니다. 일반적으로 리디렉션 대상에서 매개변수 확장을 인용할 필요가 없습니다. 단, ksh88과 비 POSIX 모드의 bash 쉘(후자는 여전히 널리 사용됨)을 제외하고는 이를 인용하는 것이 좋습니다.$F
-
=
-
awk
$F
여기서 정규식 일치 대신 하위 문자열 검색을 수행할 수 있습니다.
awk 'index($0, "+SOLUTION/ESTIMATES"), index($0, "-SOLUTION/ESTIMATES")' < "$F" > "$fil$F"
이 줄에서 인쇄예정확히는+SOLUTION/ESTIMATES
예정확히 -SOLUTION/ESTIMATES
(또는 찾을 수 없는 경우 입력 끝까지):
awk '$0 == "+SOLUTION/ESTIMATES", $0 == "-SOLUTION/ESTIMATES"' < "$F" > "$fil$F"
다음 을 사용하여 perl
더 큰 유연성을 제공합니다 .
# regex, but with different delimiters (m@...@, m{...}...)
perl -ne 'print if m{\+SOLUTION/ESTIMATES} .. m{-SOLUTION/ESTIMATES}'
# regex but use \Q...\E regex quoting for anything inside to be taken literally:
perl -ne 'print if m{\Q+SOLUTION/ESTIMATES\E} .. m{-SOLUTION/ESTIMATES}'
# substring search with q(...) as strong quotes, same as '...' except
# easier to use inside shell '...' quotes.
perl -ne 'print if index($_, q(+SOLUTION/ESTIMATES)) >= 0 ..
index($_, q(-SOLUTION/ESTIMATES)) >= 0'
# string equality with eq
perl -lne 'print if $_ eq q(+SOLUTION/ESTIMATES) ..
$_ eq q(-SOLUTION/ESTIMATES)'
답변2
이 패턴 사이의 선을 어떻게 인쇄할 수 있나요?
레코드 간의 /
패턴을 교체하여 (및 해당 패턴이 포함된 레코드) 인쇄할 수 있습니다.\57
하지만 읽어주세요범위 표현식을 사용하기 전에.
$ echo 'foo/bar was here' | awk '/foo\57bar/'
foo/bar was here
답변3
awk에서 사용하는 경우정규식상수 슬래시 문자는 주변 구분 기호와 구별하기 위해 이스케이프되어야 합니다. GNU awk를 예로 들어 보겠습니다.
$ echo 'foo/bar was here' | gawk '/foo/bar/'
awk: cmd. line:2: /foo/bar/
awk: cmd. line:2: ^ unexpected newline or end of string
하지만
$ echo 'foo/bar was here' | gawk '/foo\/bar/'
foo/bar was here
또한 이 +
문자는 awk에서 사용하는 ERE(확장 정규 표현식) 방언에서 특별한 의미를 가지며 리터럴 더하기 문자와 일치시키려면 이스케이프해야 합니다. 그래서:
/\+SOLUTION\/ESTIMATES/,/-SOLUTION\/ESTIMATES/