在多个条件下将文本附加到一行

时间:2013-09-13 21:42:14

标签: sed

我是sed的新手所以请耐心等待...我有一个内容如

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

我想将'x'追加到以'c ='开头并且不包含'x'的行。我现在使用的是

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

但是这并没有涵盖我的解释的第二部分,只有当行没有它时才应附加'x',因此如果我运行命令两次它会使行“c = 3xx”,我不想要。

这里的任何帮助都会受到高度赞赏,我知道这里有很多尖锐的脑袋:)我知道这可以通过bash轻松处理,但是在这里使用sed是一个很难的要求。

3 个答案:

答案 0 :(得分: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/ }'

答案 1 :(得分: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变量。

答案 2 :(得分:0)

这可能适合你(GNU sed):

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

或:

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