使用sed基于第9列更改第11列的值

时间:2014-05-08 07:27:05

标签: regex sed

我有一个文本文件,其中包含空格分隔值。第9列包含需要匹配的字段(ice),但第11列需要根据匹配进行替换。示例:

    a b c d e f g h ice j k l m

预期输出:

    a b c d e f g h ice j keep l m

我试着用这个:

    sed -i -r 's/ice [^ ]*/ice keep/' test.log

但它给出了这个:

    a b c d e f g h ice keep k l m

请帮帮我。我不熟悉sed和regex。

3 个答案:

答案 0 :(得分:1)

这更适合awk或任何其他了解的工具:

awk '{if ($9=="ice") {$11="keep"} print}' inputfile

默认情况下,awk中的字段由空格分隔。 $9表示9 th 字段。如果9 th 字段为ice,则将11 th 更改为keep

为了您的输入,它会产生:

a b c d e f g h ice j keep l m

你也可以使用sed来做,但这不是很直接:

sed -r 's/^(([^ ]+ ){8}ice \S+ )(\S+)/\1keep/' inputfile

此处([^ ]+ ){8}将匹配前8个字段。 (([^ ]+ ){8}ice \S+ )匹配10个字段,其中9 th ice,并将其捕获到稍后使用反向引用\1替换的组中。

答案 1 :(得分:1)

这可能适合你(GNU sed):

sed -r '/^((\S+\s+){8}ice\s+\S+\s)\S+/s//\1keep/' file

这将第9个非间隔值与ice匹配,然后将第11个非间隔值更改为keep

答案 2 :(得分:0)

在你的样本中它可以工作,但不计算列数,你真的需要列引用还是只需要内容?

sed '/ice/ s/k/keep/' YourFile