awk: 논리 OR로 표현식 결합

awk: 논리 OR로 표현식 결합

두 개의 awk 표현식을 결합(논리적 OR)하고 싶습니다. 별도로 둘 다 잘 작동합니다. 첫 번째 표현식은 검색어 바로 앞에 줄을 인쇄합니다. 두 번째 표현식은 특수 문자가 포함된 줄만 인쇄합니다. 두 표현식을 OR 연산자로 결합하면 오류가 발생합니다.

^ 예기치 않은 개행 문자 또는 문자열 끝

'

awk '(({$0~/\*/; print a; a=$0}) || (/\→/))' file.txt

file.txt는 다음과 같습니다.

foo
*
bla
bla
bar→
bar→
foo
*
bla
bla
bar→
foo
*
bla
bar→
bar→

예상 결과:

foo
bar→
bar→
foo
bar→
foo
bar→
bar→

답변1

요구사항을 읽고 설명합니다.에 대한 다양한 표현두 가지 다른 직업. 당신은 말한다 :

First expression prints the line right before the search term
Second expression just prints the line that contains a special character

이는 두 표현식을 OR로 결합할 수 없음을 의미합니다. 동일한 작업을 수행하는 OR 표현식과 결합합니다.

결과적으로 귀하의 표현에 따른 정답은 다음과 같습니다.

$ awk '/\*/{print a}{a=$0}/\→/' <<<"$a"
foo
bar→
bar→
foo
bar→
foo
bar→
bar→

서로 다른 두 조건에 대해 동일한 작업을 수행하기 위해 실제로 OR 조건을 사용해야 하는 경우 다음과 같이 수행할 수도 있습니다.

awk '/[*→]/{print a; a=$0}' file

답변2

인쇄에 대한 참고사항과 함께이전의별표가 보이는 라인과현재의다음을 볼 때 라인 :

awk '/\*/ {print prev} /\→/ {print} {prev=$0}' file.txt

/pattern/ {action}는 약자입니다 $0 ~ /pattern/ {action}. 첫 번째 작업은 prev줄에 별표가 있으면 변수를 인쇄하고 , 두 번째 작업은 화살표가 있으면 현재 줄을 인쇄하고, 마지막으로무조건현재 줄을 에 저장 prev하면 다음 줄이 일치할 경우 인쇄할 수 있습니다.

답변3

이것은 작동합니다:

awk '/\*/ || /→/ {print}' /path/to/file

답변4

이는 귀하가 인용한 예상 결과를 제공합니다. "POSIX awk 및 gawk에서는 '*', '+' 및 '?'를 사용할 수 있으므로 *를 벗어날 필요가 없습니다. 연산자 앞에 오는 정규식에 아무것도 없을 때 연산자는 스스로를 나타냅니다." 여기서의 행동에 대한 자세한 내용은 다음을 참조하세요.https://www.gnu.org/software/gawk/manual/gawk.html#Regexp

$ awk '/*/||/→/' file.txt
foo*
bar→
bar→
foo**
bar→
foo*
bar→
bar→
$

대신 grep 사용:

$ grep -E '\*|→' file.txt

관련 정보