我正在尝试搜索并替换文件中的某些行,但是当我运行时,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'
tm
m
如果任何替换成功,则分支到标签。在那里,我们放入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
声明。