如何用linux中的不同字符串替换相同的出现次数

时间:2017-10-23 20:58:49

标签: linux awk sed

我已经看过很少类似的类型问题了,但是我在这里发布了不同的情况。 我必须将不同的字符串替换为文件中的相同出现。我用过

sed -i 's/X/Y/g' file.txt

对于类似的出现,我使用过像

这样的行号

sed -i '3s/X/Y/g ; 4s/X/Z/g' file.txt

只有当这些字符串始终在同一行时才可以使用。

Ex:file.txt

这种颜色是

... 更多行

这种颜色是

... 更多行

这种颜色是

... 更多行

这种颜色是

... 更多行`

我需要将它们更改为

此颜色为蓝色

... 更多行

此颜色为红色

... 更多行

此颜色为绿色

... 更多行

此颜色为黄色

... 更多行

不使用行号。如果添加更多信息,这些字符串的行号可以随时更改吗?

任何人都可以帮忙。谢谢

2 个答案:

答案 0 :(得分:2)

awk救援!

如果行数多于颜色

,这将循环显示颜色
$ awk -v colors='blue,red,green,yellow' 'BEGIN {n=split(colors,v,",")}
                                       /color/ {$0=$0 OFS v[i++%n+1]}1' file

将其嵌入到带引号的字符串中,完全删除双引号会更容易。只需更改为

$ awk -v colors='blue red green yellow' 'BEGIN {n=split(colors,v)}
                                       /color/ {$0=$0 OFS v[i++%n+1]}1' file

如果你的颜色不是单个单词,你不能使用上面的,所以回到用逗号分隔(或任何其他分隔符),只需要逃避它们

$ awk -v colors='true blue,scarlet red,pistachio green,canary yellow' '
                       BEGIN {n=split(colors,v,\",\")}
                     /color/ {$0=$0 OFS v[i++%n+1]}1' file

答案 1 :(得分:2)

你的问题不明确,但它的声音就像你试图这样做:

awk 'NR==FNR{colors[NR];next} /This color is/{$0 = $0 OFS colors[++c]} 1' colors file

其中colors是每行包含一种颜色的文件,file是您希望添加颜色值的文件。如果那不是您想要的,那么编辑您的问题以更清楚地指定您的要求,并提出一个更好(和完整/可测试)的例子。