返回的SED代码不匹配(Return code of sed for no match)

2019-08-22 04:26发布

我使用sed更新的json配置文件中运行。 有时,当模式不以JSON文件相匹配,还是sed退出,返回代码为0。

返回0意味着成功完成,但为什么sed返回0,如果它不找到合适的模式和更新文件? 是否有一个解决方法吗?

谢谢!

Answer 1:

如@cnicutar评论,如果成功执行命令的命令的返回代码装置。 有没有跟你在代码/脚本实现的逻辑。

所以,如果您有:

echo "foo"|sed '/bar/ s/a/b/'

SED将返回0 ,但如果你写一些语法/表达错误,或者输入/文件不存在,sed中不能执行您的要求,用sed将返回1。

解决方法

这其实不是解决办法 。 SED具有q命令:(从手册页):

 q [exit-code]

这里你想你可以定义退出代码。 例如'/foo/!{q100}; {s/f/b/}' '/foo/!{q100}; {s/f/b/}'将与代码100退出如果foo不存在,以及以其他方式执行替换F-> B和与代码0退出。

配套情况:

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

无与伦比的情况下:

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

我希望这回答了你的问题。

编辑

我要补充的是,上面的例子仅仅是一个在线处理。 我不知道您的具体要求。 当你想exit 1 。 单行匹配或整个文件。 如果整个文件不匹配的情况下,你可能会考虑AWK,甚至做grep文字处理之前...



Answer 2:

这可能会为你工作(GNU SED):

sed '/search-string/{s//replacement-string/;h};${x;/./{x;q0};x;q1}' file

如果search-string被发现,将被替换为replacement-string ,并在结束文件sed将退出0返回代码。 如果没有取代反应的返回代码将是1

更详细的说明:

在sed用户具有在他的处置两个寄存器:其中电流线加载到图案空间(PS)(减去换行)和备用寄存器称为保持空间(HS),其最初是空的。

总的想法是使用HS作为一个标志,指示是否替代已经发生。 如果HS依旧在文件的结尾空,则不改变已作出,否则发生了改变。

命令/search-string/匹配search-string与无论是在PS和如果它被发现含有search-string以下大括号之间的命令被执行。

首先取代s//replacement-string/ (SED使用最后的regexp即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

NB虽然q退出sed的处理它不阻止从PS由SED被重新组装和印刷按正常。

另一种选择:

sed '/search-string/!ba;s//replacement-string/;h;:a;$!b;p;x;/./Q;Q1' file

要么:

sed '/search-string/,${s//replacement-string/;b};$q1' file


Answer 3:

这些答案都太复杂了。 什么是错写一点shell脚本的使用grep来弄清楚,如果要更换的东西是存在的,然后使用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


Answer 4:

下面是我们与使用模式sed -rnsed -r

整个搜索和替换命令( “S / ... / ... / ...”)是可选的。 如果搜索和替换使用,速度和在已经匹配$ matchRe,我们用尽可能快一个$ searchRe值尽可能使用。 在字符不需要被重新验证和。{$ LEN}用于图案的固定长度段。

发现无返回值是$ notFoundExit。

/$matchRe/{s/$searchRe/$replacement/$options; Q}; q$notFoundExit

原因有以下几点:

  • 两个匹配和不匹配的情况下,无需浪费时间测试
  • 无需浪费时间复制或从缓冲区
  • 没有多余的枝条
  • 合理灵活性

变化的Q命令的情况下,将根据时发生了出口的不同而不同的行为。 涉及布尔逻辑到多线输入的应用程序行为需要更多的在溶液中的复杂性。



Answer 5:

我本来想通过比赛时被发现戒烟截断文件(并排除匹配的行)。 这是很方便的时候,在文件的最后添加线过程可以重新运行。 “Q; Q1”没有工作,但只是“Q1”的确,如下所示:

如果用sed -i“/文我想找个/ Q1” file.txt的再插入在文件+新线连接的插入端的空行不空行只是新线



Answer 6:

正如我们已经知道,当SED不匹配,那么它只是返回其输入的字符串 - 没有出现错误。 这是事实,输入和输出字符串之间的差异暗示了比赛,但比赛并不意味着弦的差异; 所有SED后可以简单匹配所有输入的字符。 该缺陷将在下面的示例中创建

h=$(echo "$g" | sed 's/.*\(abc[[:digit:]]\).*/\1/g')    
if [ ! "$h" = "$g" ]; then    
  echo "1"   
else    
  echo "2"    
fi

其中g=Xabc1得到1,同时设定g=abc1给出2; 然而这两种输入字符串被sed的匹配! 因此,它可以是很难确定SED是否匹配与否。 一个办法:

h=$(echo "fix${g}ed" | sed 's/.*\(abc[[:digit:]]\).*/\1/g')
if [ ! "$h" = "fix${g}ed" ]; then    
  echo "1"   
else    
  echo "2"    
fi

在这种情况下,1印像,如果且仅-如果sed的已匹配。



文章来源: Return code of sed for no match
标签: linux json sed