我试图搜索并替换文件的一些线,但是当我运行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)
tm
m
如果任何替换成功,则分支到标签。在那里,我们放入1
我们在最后一行寻找的保留空间。
首先,包括 在内的所有命令都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
声明。