首页 > 解决方案 > 使用 sed 更新特定字段

问题描述

sed我正在尝试使用Bourne Shell 中的命令更新特定行上的特定字段。

假设我有一个文件TopScorer.txt

Player:Games:Goals:Assists
Salah:9:9:3
Kane:10:8:4

而且我需要更新玩家的第三列(目标),我尝试了这个命令并且它可以工作,除非游戏和目标具有相同的值,然后它会更新第一个

player="Salah"
NewGoals="10"
OldGoals=$(awk -F':' '$1=="'$player'"' TopScorer.txt | cut -d':' -f3)
sed -i '/^'$player'/ s/'$OldGoals'/'$NewGoals'/' TopScorer.txt

Output> Salah:10:9:3 instead of Salah:9:10:3

有什么解决办法吗?我应该使用分隔符并$3==...指定该字段吗?我还尝试了第二次出现的选项 /2 ,但在我的情况下它不是很方便。

标签: shellunixawksed

解决方案


您可以只使用awk单独而不是使用sed. 另请注意,它awk具有从 shell 导入变量的内部语法。所以你的代码就变成了

awk -F: -v pl="$player" -v goals="$NewGoals" 
    'BEGIN { OFS = FS } $1 == pl { $3= goals }1' TopScorer.txt

-F:输入分隔符设置为:,并且涉及-v将您的 shell 变量导入到awk. 将BEGIN { OFS = FS }输出字段分隔符设置为与输入相同。然后我们使用导入的变量进行匹配并更新$3为所需的值。

要就地进行修改,请使用临时文件

awk -F: -v pl="$player" -v goals="$NewGoals" 
   'BEGIN { OFS = FS } $1 == pl { $3= goals }1' TopScorer.txt > tmpfile && mv tmpfile TopScorer.txt

推荐阅读