我正在sed
用于在运行时更新我的json配置文件.有时,当模式在json文件中不匹配时,仍然sed
以退货代码0退出.
返回0表示成功完成,但sed
如果找不到正确的模式并更新文件,为什么返回0?有解决方法吗?
谢谢!
Ken*_*ent 51
正如@cnicutar所评论的,命令的返回码意味着命令是否成功执行.与您在代码/脚本中实现的逻辑无关.
所以如果你有:
echo "foo"|sed '/bar/ s/a/b/'
Run Code Online (Sandbox Code Playgroud)
sed会返回0
但是如果你写了一些语法/表达式错误,或者输入/文件不存在,sed就无法执行你的请求,sed会返回1.
解决方法
这实际上不是解决方法.sed有q
命令:(来自手册页):
q [exit-code]
Run Code Online (Sandbox Code Playgroud)
在这里,您可以根据需要定义退出代码.例如'/foo/!{q100}; {s/f/b/}'
,如果foo
不存在则退出代码100 ,否则执行替换f-> b并退出代码0.
配对案例:
kent$ echo "foo" | sed '/foo/!{q100}; {s/f/b/}'
boo
kent$ echo $?
0
Run Code Online (Sandbox Code Playgroud)
无与伦比的案例:
kent$ echo "trash" | sed '/foo/!{q100}; {s/f/b/}'
trash
kent$ echo $?
100
Run Code Online (Sandbox Code Playgroud)
我希望这回答了你的问题.
编辑
我必须补充一点,上面的例子仅用于单行处理.我不知道你的具体要求.当你想要的时候exit 1
.单行不匹配或整个文件.如果整个文件不匹配的情况下,你可以考虑awk,甚至grep
在你的文本处理之前做一个...
pot*_*ong 48
这可能适合你(GNU sed):
sed '/search-string/{s//replacement-string/;h};${x;/./{x;q0};x;q1}' file
Run Code Online (Sandbox Code Playgroud)
如果search-string
找到它将被替换为,replacement-string
并且在文件结束时sed
将退出并0
返回代码.如果没有替换发生,则返回代码将是1
.
更详细的解释:
在用户中,用户可以使用两个寄存器:当前行加载到的模式空间(PS)(减去换行符)和一个称为保持空间(HS)的备用寄存器,它最初是空的.
一般的想法是使用HS作为标志来指示是否发生了替换.如果HS在文件末尾仍为空,则表示未进行任何更改,否则会发生更改.
该命令/search-string/
与search-string
PS中的任何内容匹配,如果发现它包含search-string
以下大括号之间的命令则执行.
首先是替换s//replacement-string/
(sed使用最后一个正则表达式,即search-string
如果左侧是空的,那么s//replacement-string
它是相同的s/search-string/replacement-string/
),然后h
命令生成PS的副本并将其放入HS中.
sed命令$
用于识别文件的最后一行,然后发生以下行.
首先,x
命令交换两个寄存器,因此HS成为PS,PS成为HS.
然后在PS中搜索任何字符/./
(.
意味着匹配任何字符),记住HS(现在PS)最初是空的,直到替换发生.如果条件为真,x
则再次执行,然后执行q0
命令,该命令结束所有sed处理并将返回代码设置为0
.否则x
执行命令并将返回码设置为1
.
注意虽然q
退出处理它不会阻止PS被sed重新组装并按照正常情况打印.
另一种选择:
sed '/search-string/!ba;s//replacement-string/;h;:a;$!b;p;x;/./Q;Q1' file
Run Code Online (Sandbox Code Playgroud)
要么:
sed '/search-string/,${s//replacement-string/;b};$q1' file
Run Code Online (Sandbox Code Playgroud)
gil*_*ilz 20
这些答案都太复杂了.写一些使用grep的shell脚本来判断你想要替换的东西是否在那里然后使用sed替换它有什么问题?
grep -q $TARGET_STRING $file
if [ $? -eq 0 ]
then
echo "$file contains the old site"
sed -e "s|${TARGET_STRING}|${NEW_STRING}|g" ....
fi
Run Code Online (Sandbox Code Playgroud)
Jen*_*sen 11
对于1 行输入。为了避免重复/模式/:
当s
替换成功后,使用t
来有条件地跳转到某个标签,例如x
。否则使用q
退出代码退出,例如100
:
's/pattern/replacement/;tx;q100;:x'
例子:
$ echo 1 > one
$ < one sed 's/1/replaced-it/;tx;q1;:x'
replaced-it
$ echo $?
0
$ < one sed 's/999/replaced-it/;tx;q100;:x'
1
$ echo $?
100
Run Code Online (Sandbox Code Playgroud)
https://www.gnu.org/software/sed/manual/html_node/Branching-and-flow-control.html
归档时间: |
|
查看次数: |
49860 次 |
最近记录: |