如何使用SED一次性替换字符串中的多个部分?
使用sed实现指定文本的原地替换
需求说明
需要将文件中的目标行:
'display min(min(sindex,lon=%lon1%,lon=%lon2%),lat=%lat1%,lat=%lat2%)'
替换为:
'display amin(actualPrecip,lon=%lon1%,lon=%lon2%,lat=%lat1%,lat=%lat2%)'
实现命令
方法一:分步替换(直观易读)
针对三处修改点依次处理,适合GNU sed(Linux系统):
sed -i 's/'\''display min(min('\''/'\''display amin('\''/; s/sindex/actualPrecip/; s/),/,/' 你的文件名.txt
如果是BSD sed(如macOS系统),需调整-i参数格式:
sed -i '' 's/'\''display min(min('\''/'\''display amin('\''/; s/sindex/actualPrecip/; s/),/,/' 你的文件名.txt
方法二:正则分组一次性替换(精准高效)
通过正则捕获中间固定内容,一次完成所有修改,GNU sed版本:
sed -i 's/'\''display min(min(sindex,\(.*\)),/\''display amin(actualPrecip,\1,/' 你的文件名.txt
BSD sed版本:
sed -i '' 's/'\''display min(min(sindex,\(.*\)),/\''display amin(actualPrecip,\1,/' 你的文件名.txt
关键说明
-i:sed的原地替换参数,GNU sed直接使用该参数即可修改原文件;BSD sed需要追加空引号'',避免自动生成备份文件- 分步替换的三个动作分别对应:
- 替换外层的
min(min(为amin( - 将
sindex替换为actualPrecip - 移除多余的闭合括号,把
),替换为,
- 替换外层的
- 分组替换通过
\(.*\)捕获lon=%lon1%,lon=%lon2%部分,替换时引用该内容,确保只修改目标结构,不影响其他字段
内容的提问来源于stack exchange,提问作者Mike Manning
相关产品推荐
相关产品推荐

