2

我对 sed 很陌生,所以请多多包涵……我有一个文件,其内容如下

a=1
b=2,3,4
c=3
d=8
.
.

我想将“x”附加到以“c=”开头且不包含“x”的行。我现在使用的是

sed -i '/^c=/ s/$/x/'

但这不包括我解释的第二部分,只有在该行还没有它的情况下才应该附加“x”,因此如果我运行该命令两次,它会生成我不想要的“c = 3xx”行.

在这里的任何帮助将不胜感激,我知道这里有很多敏锐的头脑:) 我知道这可以通过 bash 很容易地处理,但在这里使用 sed 是一个硬性要求。

4

3 回答 3

4

你可以这样做:

sed -i '/^c=/ {/x/b; s/$/x/}'

花括号用于分组。该b命令分支到脚本的末尾(停止当前行的处理)。

   b label
          Branch to label; if label is omitted, branch to end of script.

编辑:正如 William Pursell 在评论中建议的那样,较短的版本是

sed -i '/^c=/ { /x/ !s/$/x/ }'
于 2013-09-13T21:46:25.970 回答
2

awk在这里可能是一个更好的选择,因为您可以轻松地将正则表达式匹配与逻辑运算符结合起来。给定输入:

$ cat file
a=1
b=2,3,4
c=3
c=x
c=3
d=8

命令将是:

$ awk '/^c=/ && !/x/ {$0=$0"x"; print $0}' file
a=1
b=2,3,4
c=3x
c=x
c=3x
d=8

包含正在读取的当前行$0的变量在哪里。awk

于 2013-09-13T21:52:08.783 回答
0

这可能对您有用(GNU sed):

sed -i '/^c=[^x]*$/s/$/x/' file

或者:

sed -i 's/^c=[^x]*$/&x/' file
于 2013-09-14T01:04:42.893 回答