使用 sed 命令应用条件来检查模式是否已匹配

Sam*_*ynn 8 command-line bash sed

我正在搜索字符串::=BEGIN,我想应用一个条件来检查是否找到了该词。

所以,我的意思是这样的:

if (sed command does find a match for "::=BEGIN")
then i=1 
else i=0
Run Code Online (Sandbox Code Playgroud)

另外,我希望将 1(找到是)和 0(未找到)放入变量“i”中。

请帮帮我。还提供解决方案的解释!谢谢!

Ser*_*nyy 6

grep 做这项工作足够好。

$ echo "::=BEGIN" > testfile1.txt

$ grep "::=BEGIN" -q testfile1.txt && echo "FOUND"
FOUND

$ grep "::=BEGIN" -q testfile1.txt && echo "FOUND" || echo "NOTFOUND"
FOUND

$ grep "whever" -q testfile1.txt && echo "FOUND" || echo "NOTFOUND"
NOTFOUND
Run Code Online (Sandbox Code Playgroud)

代码所做的只是在 subshel​​l 中运行一个安静的搜索。&&或逻辑与操作数,检查第一个命令是否成功,如果成功,则运行echo "FOUND"||检查该回声是否已运行,即,是否发现了任何内容。第二个 echo 仅在第一个命令失败时运行。

这是一个awk版本:

$ awk '{i="NOTFOUND";if($0~/::=BEGIN/) i="FOUNDIT";exit } END { print i}' testfile1.txt
FOUNDIT

$ awk '{i="NOTFOUND";if($0~/whatevs/) i="FOUNDIT";exit } END { print i}' testfile1.txt
NOTFOUND
Run Code Online (Sandbox Code Playgroud)

这里的基本思想是设置iNOTFOUND,如果我们找到字符串 - 将其更改为FOUNDIT。在第一组处理完文件后,我们会在最后打印i,它会告诉我们是否找到了一些东西。

编辑:在您提到要将结果放入变量的评论中。Shell 已经提供了一个变量来报告上一个命令的退出状态,$0. 退出状态 0 表示成功,其他一切 - 失败。例如,

$ grep "::=BEGIN" -q testfile1.txt  
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)

如果你想使用一个变量退出状态,你可以做到这一点,像这样:MYVAR=$(echo $?)。记住,$? 报告上一个命令的退出状态。所以你必须在 grep 命令之后立即使用它。

如果您仍想使用我之前的 awk 和 grep 单行代码,您可以使用相同的技巧MYVAR=$()并在大括号之间放置您想要的任何命令。输出将分配给变量MYVAR


mik*_*erv 6

使用 GNU sed (默认安装在任何 Ubuntu 系统上)

{ sed -n '/::=BEGIN/Q 1'; i=$?; } <infile
Run Code Online (Sandbox Code Playgroud)

关于这个答案的一些事实:

  1. sed Q只要在文件中的任何位置找到第一个匹配项,就立即匹配输入- 这意味着它不会再浪费时间继续读取 infile。

  2. sed 在其退出代码中返回数值01,具体取决于它是否无法/无法找到寻址的正则表达式。

  3. $i设置为sed退出时返回。

  4. {分组; }用于可靠地处理任何可能的重定向错误-$i没有的情况下设置的外壳不能打开所有的文件,从而避免误报。

但是,这可能不应该优先于grep -q,它基本上也可以执行上述所有操作(如果相反),按 POSIXly 执行,并且通常更快。

已经给出的grep -q答案非常好,但是,更简洁:

grep -q pattern ./infile; i=$((!$?))
Run Code Online (Sandbox Code Playgroud)