安全な代替手段としてgrep / sedを使用する方法

安全な代替手段としてgrep / sedを使用する方法

grep操作をネストする方法を探しているので、最初のgrepが一致しない場合は入力に次のものを使用しますが、一部のgrepが正常に終了するとチェーンが破棄されます。

最初のgrepで失敗すると予想しecho $'b\nc\nd' | { grep 'a' || grep 'b' || grep 'c' || grep 'd'; } て2番目の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

関連情報