"/"가 이름의 일부인 경우 awk는 줄 사이에 인쇄합니다.

"/"가 이름의 일부인 경우 awk는 줄 사이에 인쇄합니다.

이름에 "/"가 포함된 줄 사이의 줄을 인쇄해야 합니다. 나는 이전에 시도했습니다:

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문자 값과 함께 사용됩니다 /( \57ASCII 기반 시스템, 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/

관련 정보