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”中。
请帮帮我。还提供解决方案的解释!谢谢!
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)
代码所做的只是在 subshell 中运行一个安静的搜索。&&
或逻辑与操作数,检查第一个命令是否成功,如果成功,则运行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)
这里的基本思想是设置i
为NOTFOUND
,如果我们找到字符串 - 将其更改为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
。
使用 GNU sed
(默认安装在任何 Ubuntu 系统上):
{ sed -n '/::=BEGIN/Q 1'; i=$?; } <infile
Run Code Online (Sandbox Code Playgroud)
关于这个答案的一些事实:
sed
Q
只要在文件中的任何位置找到第一个匹配项,就立即匹配输入- 这意味着它不会再浪费时间继续读取 infile。
sed
在其退出代码中返回数值0或1,具体取决于它是否无法/无法找到寻址的正则表达式。
$i
设置为sed
退出时返回。
该{
分组; }
用于可靠地处理任何可能的重定向错误-$i
没有的情况下设置的外壳不能打开所有的文件,从而避免误报。
但是,这可能不应该优先于grep -q
,它基本上也可以执行上述所有操作(如果相反),按 POSIXly 执行,并且通常更快。
已经给出的grep -q
答案非常好,但是,更简洁:
grep -q pattern ./infile; i=$((!$?))
Run Code Online (Sandbox Code Playgroud)