如果正则表达式不匹配,为什么“sed”不返回退出状态?

如果正则表达式不匹配,为什么“sed”不返回退出状态?

我正在尝试搜索并替换文件中的某些行,但是当我运行时,sed如果该正则表达式不匹配,则sed不会返回任何状态代码,因此,与其添加一个条件,不如添加一个条件grep,而是有办法进入sed,为什么sed不返回退出状态?

问题 :

在此输入图像描述

答案1

sed 返回退出状态:

$ echo "foo" | sed 's/xx/yy/'
foo
$ echo $?
0
$ sed 's/xx/yy/' foo.txt
sed: can't read foo.txt: No such file or directory
$ echo $?
2

Sed 的退出代码与程序是否成功退出有关,它们与正在执行的操作的内部无关sed,只与命令是否成功运行有关。

也就是说,GNU sed 确实提供了一种方法来做到这一点:

   q [exit-code]
          Immediately  quit  the sed script without pro‐
          cessing any more input, except that  if  auto-
          print  is  not  disabled  the  current pattern
          space will be printed.  The exit code argument
          is a GNU extension.

例如(取自这里):

$  echo "foo"|sed '/foo/ s/f/b/;q'                                                                       
boo
$  echo $?
0
$ echo "trash"|sed  '/foo/{s/f/b/;q}; /foo/!{q100}'
trash
$  echo $?
100

如果您想举报以下事实任何在输入的任何行上替换都已成功,您可以在保留空间中标记成功替换并在最后一行检查它:

seq 6 | sed 's/4/four/;s/5/five/; tm;${x;/1/{x;q};x;q1};b;:m;x;s/.*/1/;x'

tmm如果任何替换成功,则分支到标签。在那里,我们放入1了保留空间,我们在最后一行寻找该空间。

答案2

首先,所有命令(包括sed)都会返回退出状态。您正在寻找为什么我不会返回失败。这就引出了第二点。

像这样的程序sed是编辑器,而不是谓词。它们的作用是改变流经程序的数据。错误条件是指无效的内部命令或命令行上不存在的文件等情况。

我不确定你想要什么逻辑 - 你不包含任何预期的输出 - 但这可能就是你正在寻找的:

$ sed '/^test line 7/s//#test line 7/;/^#test line 7/s//& \nAppend New Line/' test.txt
test line 1
test line 2
test line 3
test line 4
test line 5
test line 6
#test line 7
Append New Line

还有其他结构也可以处理这个问题,b例如sed.

如果您想要实际的返回代码(如果未找到),那么您可能需要查看gawk及其exit声明。

相关内容