두 개의 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