bash:如果两行在该字段中具有相同的内容,如何只替换一个字段

时间:2011-08-08 04:46:27

标签: bash sed awk

好的,这让我发疯了。

我有一个冒号分隔的4个字段文件。我试图只用变量替换最后一个字段。但问题是当两行具有相同的内容时,它们都将被改变。我在想是否可以给一个关于我想改变哪一行的参考。换句话说,如果第一个字段是R2,则替换其最后一个字段

文件:

R1:name1:date1:black
R2:name2:date2:black

我希望它像这样

R1:name1:date1:black
R2:name2:date2:black2

这是我到目前为止所拥有的

变量已经分配了第四个字段。已为名称分配了zenity文本框,供用户输入名称。

variable=$(awk -F ":" '$2 ~ /'"$name"'/ {print $4}' file)

sed -i 's/'$variable'/black2/g' file

提前致谢。

2 个答案:

答案 0 :(得分:2)

您可以限制sed将其替换应用于哪些行:

sed -i '/^R2/s/:black$/:black2/' file

请注意该行开头的^$,以避免在该行的其他位置替换黑色。

编辑:我将g参数删除为sed,因为每行需要单个替换。 g参数适用于行,而不适用于整体输入。

答案 1 :(得分:2)

或者使用awk的解决方案,但无法像sed那样修改到位这样的文件,因此需要mv:

awk -F ":" '($1 == "R2" && $4 == "black"){print $1 ":" $2 ":" $3 ":black2"} ($1 != "R2" || $4 != "black"){print $1 ":" $2 ":" $3 ":" $4}' file > file1
mv file1 file

或者更短:

awk -F ":" '{print $1 ":" $2 ":" $3 ($1 == "R2" && $4 == "black"? ":black2" : ":" $4)}' file > file1
mv file1 file