我有一个文本文件,其中包含空格分隔值。第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。
答案 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