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

Rah*_*til 8 sed

我试图搜索并替换文件的一些线,但是当我运行sed,如果该正则表达式不匹配,那么sed不返回所以不是增加一个条件与任何状态代码grep,有没有办法sed?为什么sed不返回退出状态?

问题 :

在此处输入图片说明

ter*_*don 15

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
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)

例如(取自此处):

$  echo "foo"|sed '/foo/ s/f/b/;q'                                                                       
boo
$  echo $?
0
$ echo "trash"|sed  '/foo/{s/f/b/;q}; /foo/!{q100}'
trash
$  echo $?
100
Run Code Online (Sandbox Code Playgroud)

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

seq 6 | sed 's/4/four/;s/5/five/; tm;${x;/1/{x;q};x;q1};b;:m;x;s/.*/1/;x'
Run Code Online (Sandbox Code Playgroud)

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


Arc*_*ege 6

首先,包括 在内的所有命令都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
Run Code Online (Sandbox Code Playgroud)

有它可以处理这个问题,以及其它结构,例如,b在(分支)命令sed

如果您想要一个实际的返回码(如果没有找到),那么您可能需要查看gawk它的exit声明。