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

관련 정보