Bash

如何將 grep/sed 作為安全備份

  • May 5, 2020

我正在尋找一種嵌套 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因為它有優先權

你想要的東西可以用awkonly 但不能用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

引用自:https://unix.stackexchange.com/questions/583969