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