如何仅对CSV文件的第3、4列执行指定内容的搜索替换操作
CSV指定列搜索替换方案
处理按列替换需求时,awk 比 sed 更适配,它天然支持字段级别的操作,不会影响其他列内容,以下是适配你需求的实现:
1. 适配场景说明
如果你的文件是标准逗号分隔CSV,直接使用下方方案;如果是多空格/制表符分隔的类CSV格式,仅需调整命令中的输入输出分隔符即可。
2. 具体执行命令
单命令行版本(直接运行)
标准逗号分隔CSV用这个:
awk 'BEGIN{FS=OFS=","} NR==1{print;next} {sub(/stack\.overflow2/,"prince.caballero",$3);sub(/stack\.overflow/,"macy.greytold",$3);sub(/stack\.overflow2/,"prince.caballero",$4);sub(/stack\.overflow/,"macy.greytold",$4);print}' 你的文件名.csv > 输出文件名.csv
你示例里的多空格分隔格式用这个:
awk 'BEGIN{FS="[[:space:]]+";OFS="\t"} NR==1{print;next} {sub(/stack\.overflow2/,"prince.caballero",$3);sub(/stack\.overflow/,"macy.greytold",$3);sub(/stack\.overflow2/,"prince.caballero",$4);sub(/stack\.overflow/,"macy.greytold",$4);print}' 你的文件名.csv > 输出文件名.csv
3. 命令说明
BEGIN{FS=OFS=","}:预处理阶段设置输入分隔符(FS)和输出分隔符(OFS)为逗号,多空格场景下FS设为匹配任意连续空白的正则[[:space:]]+即可NR==1{print;next}:第一行是表头直接输出,不做替换处理sub(匹配规则,替换内容,目标字段):仅对指定的第3、第4字段做替换,其他字段完全保留原始内容- 注意正则中的
.需要加转义符\,避免匹配任意字符
可选:sed实现方案
如果必须用sed实现,需要写正则锁定前两列后再处理3、4列,以逗号分隔CSV为例,命令如下:
sed -E ' # 跳过表头行 1!{ # 替换第3列匹配内容 s/^(([^,]+,){2})stack\.overflow2,/\1prince.caballero,/ s/^(([^,]+,){2})stack\.overflow,/\1macy.greytold,/ # 替换第4列匹配内容 s/^(([^,]+,){3})stack\.overflow2,/\1prince.caballero,/ s/^(([^,]+,){3})stack\.overflow,/\1macy.greytold,/ } ' 你的文件名.csv > 输出文件名.csv
sed方案对分隔符格式要求更严格,不如awk方案灵活,更推荐优先使用awk方案。
内容的提问来源于stack exchange,提问作者mac
相关产品推荐
相关产品推荐

