안전한 대체 수단으로 grep/sed를 사용하는 방법

안전한 대체 수단으로 grep/sed를 사용하는 방법

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

관련 정보