如何用Bash脚本替换CSV文件中Mr后的姓氏?
批量替换CSV中Mr后的姓氏
问题场景
CSV文件每行包含类似格式的数据:
| 11th October | 06 6606 1161 | Mr Bean is 43 years old. Mr Bean likes apples. |
需要编写replace_surname.sh脚本,执行replace_surname.sh Smith后,将所有Mr后的姓氏替换为指定新姓氏,结果如下:
| 11th October | 06 6606 1161 | Mr Smith is 43 years old. Mr Smith likes apples. |
原命令失效原因
你之前使用的sed命令:
sed -i 's/^Mr .*$/Mr PacMan/' test.csv
问题在于^Mr .*$是匹配整行以Mr开头的内容,然后替换整行,但实际数据中Mr处于行的中间位置,完全匹配不到,因此没有效果。
解决方案
正确的sed替换逻辑
使用全局匹配Mr后跟的姓氏(假设姓氏为英文字母组成的单词),并替换为指定新姓氏:
sed -i "s/Mr [A-Za-z]\+/Mr $新姓氏/g" test.csv
- 用双引号让shell解析变量(比如脚本参数)
[A-Za-z]\+匹配任意长度的英文字母姓氏,若姓氏包含连字符、撇号等特殊字符,可修改为[A-Za-z'-]\+g标记表示替换每行中所有匹配的Mr 姓氏
完整的replace_surname.sh脚本
#!/bin/bash # 校验参数数量 if [ $# -ne 1 ]; then echo "用法: $0 <新姓氏>" exit 1 fi # 替换CSV中的姓氏,若需修改目标文件,替换此处的test.csv为你的文件名 sed -i "s/Mr [A-Za-z]\+/Mr $1/g" test.csv echo "替换完成"
使用说明
- 给脚本添加执行权限:
chmod +x replace_surname.sh - 执行替换:
./replace_surname.sh Smith - 若要保留原文件备份,将sed命令改为
sed -i.bak "s/Mr [A-Za-z]\+/Mr $1/g" test.csv,原文件会被保存为test.csv.bak
内容的提问来源于stack exchange,提问作者Johnny Alpha
相关产品推荐
相关产品推荐

