如何将 grep/sed 作为安全后备

如何将 grep/sed 作为安全后备

我正在寻找一种嵌套 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

相关内容