grep 작업을 중첩하는 방법을 찾고 있으므로 첫 번째 grep이 일치하지 않으면 입력에 다음을 사용하지만 일부 grep이 성공적으로 종료되면 체인이 끊어집니다.
첫 번째 grep에서 실패할 것으로 예상 echo $'b\nc\nd' | { grep 'a' || grep 'b' || grep 'c' || grep 'd'; }
하여 두 번째 grep을 성공하고 완료하면 전역 출력이 "b"가 됩니다.
그런 다음 grep에 플래그를 지정하여 입력을 있는 그대로 출력하면 아무것도 일치하지 않는 경우 더 쉬운 방법이 있을 수 있다고 생각했습니다. 그래서 그것은 같다
echo $'b\nc\nd' | grep --if-error-print-input 'a' | grep --if-error-print-input 'b' | grep --if-error-print-input 'c' | grep --if-error-print-input 'd'
입력 및 출력 예
echo $'Foo\nBar' | grep -e 'Bar' -e 'Foo' | head -n 1
Foo
Bar
우선순위가 있기 때문에 내가 기대하는 곳
답변1
awk
당신이 원하는 것은 sed
으로만 이루어질 수 있지만 개별적으로는 불가능합니다 grep
.
$ cat regexes
c
b
a
첫 번째 일치 행은 각 패턴에 대해 저장되어야 합니다(가장 높은 일치보다 우선순위가 낮은 행은 제외).
echo $'b\nc\nd' |
awk 'BEGIN { while (getline regex <"regexes") regexes[i++]=regex; num=i; limit=i; };'\
'{ for(i=0;i<limit;i++) { if($0~regexes[i]) { regexmatch[i]=$0; limit=i; if (i==0) { exit; } else break; }; }; };'\
'END { for(i=0;i<num;i++) if (regexmatch[i]!="") { print regexmatch[i]; exit; }; }'
c