![如何将 grep/sed 作为安全后备](https://linux22.com/image/172402/%E5%A6%82%E4%BD%95%E5%B0%86%20grep%2Fsed%20%E4%BD%9C%E4%B8%BA%E5%AE%89%E5%85%A8%E5%90%8E%E5%A4%87.png)
我正在寻找一种嵌套 grep 操作的方法,因此如果第一个 grep 不匹配,则在输入上使用以下内容,但如果某些 grep 成功退出,则链会中断
我尝试echo $'b\nc\nd' | { grep 'a' || grep 'b' || grep 'c' || grep 'd'; }
期望它在第一个 grep 中失败,因此成功并完成第二个 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