sed:在添加之前测试$ line中的$ pattern

时间:2017-03-01 21:38:53

标签: bash sed redhat

有几个例子说明如何使用sed基于匹配一般模式将行添加到行尾。 Here's one example

在该示例中,海报以

开头
somestuff...
all: thing otherthing
some other stuff

并希望添加到all:的末尾,如下所示:

somestuff...
all: thing otherthing anotherthing
some other stuff

一切都很好。但是,如果anotherthing已经存在,会发生什么?!

我想找到以all:开头的行,测试是否存在 anotherthing添加它在这条线上缺失。

我该怎么做?

我的具体案例是测试kernelgrub.conf行是否存在boot=fips=1,并仅在中添加其中一个或两个参数 / em>他们还没有上线。 (我希望搜索/添加为idempotent。)

3 个答案:

答案 0 :(得分:1)

这可能适合你(GNU sed):

sed '/^all:/!b;/anotherthing/!s/$/ anotherthing/' file

取消发布任何不以all:开头的行,只替换不包含anotherthing的行。

答案 1 :(得分:1)

您可以使用此awk检查是否存在给定字符串,并仅在不存在时附加它:

awk -v s='anotherthing' '/^all:/ && $0 !~ s "$" { $0 = $0 OFS s } 1' file

答案 2 :(得分:1)

使用anotherthing略过行并将其添加到以all:

开头的其余行
sed '/anotherthing/!s/^all:.*$/& anotherthing/' file