shell - 使用 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 ,但在我的情况下它不是很方便。
解决方案
您可以只使用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
推荐阅读
- php - 删除后的Oracle插入命令给出错误
- apache-kafka - 如何将没有架构的数据发送到 kafka - 融合 jdbc - 接收器使用情况?
- python - 如何在生产环境中运行 Django 频道?
- html - 在 Visual Studio Code 中向 django-html 文件添加格式化程序(美化器)
- pandas - 如何从熊猫的所有行中删除组平均值/最小值/最大值
- flutter - 如何在图像中填充颜色
- javascript - 我可以在不同的 React 组件中调用函数吗?
- html - 如何将 CSP 标头(Content-Security-Policy)添加到 vuejs 应用程序?
- graphql - GraphQL 文档资源管理器未在浏览器 .net core 3.1 中显示
- xamarin.forms - Xamarin Forms - 将 Scope-Injected 服务从 tabbedpageviewmodel 传递到页面的视图模型