如何在Shell脚本中用Sed命令仅替换分号分隔文件指定列的目标值
仅替换分号分隔文件指定列的目标单词
方案一:用awk处理(推荐)
awk处理列分隔文件天生更便捷,直接定位指定列执行替换即可,命令如下:
awk -v col="$numColumn" -v old="$word" -v new="$wordUpdate" 'BEGIN{FS=OFS=";"} {gsub("\\<"old"\\>", new, $col)} 1' "$anyFile" > temp_file && mv temp_file "$anyFile"
命令说明:
-v col="$numColumn":把shell变量numColumn传递给awk的col变量(列号从1开始计数)-v old="$word"-v new="$wordUpdate":分别传递待替换单词和目标替换单词BEGIN{FS=OFS=";"}:设置输入、输出的列分隔符都是分号,保证输出格式和原文件完全一致gsub("\\<"old"\\>", new, $col):对第col列执行全局替换,\<和\>是单词边界,确保只替换完整单词(避免误替换包含目标单词的长字符串)1:awk中1代表逻辑真,会自动打印处理后的每一行- 最后通过临时文件中转实现原地修改,因为awk不支持直接编辑原文件
方案二:用sed处理
如果习惯使用sed,可以通过正则分组定位指定列,再替换列内的目标单词:
sed -i -E "s/^(([^;]*;){$(($numColumn-1))})([^;]*)/\1`sed "s/\<$word\>/$wordUpdate/g" <<< "\3"`/" "$anyFile"
命令说明:
-E:启用扩展正则表达式,简化分组语法^(([^;]*;){$(($numColumn-1))})([^;]*):通过正则分组匹配前numColumn-1列(以分号结尾),以及第numColumn列的完整内容- 嵌套的
sed "s/\<$word\>/$wordUpdate/g" <<< "\3":对捕获到的第numColumn列内容(\3)执行单词替换 -i:直接原地修改原文件
注意:sed方案在处理含特殊字符的单词时可能需要额外转义,稳定性不如awk方案。
内容的提问来源于stack exchange,提问作者AymanSalama
相关产品推荐
相关产品推荐

