能否使用grep、sed替换CSV文件中指定行号列号的单元格的值
解答
可以仅通过sed完成指定单元格的替换操作,不需要额外结合grep,以下是两种适配你场景的实现方案:
方案1:仅依靠行号、列号匹配(对齐你当前awk的逻辑)
通用Shell实现
#!/bin/bash newvalue=3 rownum=4 col=1 file="你的文件名" # Linux环境下直接使用 sed -i "${rownum}s/^\(\([^,]*\),\)\{$((col-1))\}[^,]*/\1${newvalue}/" "${file}.csv" # MacOS环境下使用(sed的-i参数要求指定备份后缀,空后缀表示不生成备份) # sed -i '' "${rownum}s/^\(\([^,]*\),\)\{$((col-1))\}[^,]*/\1${newvalue}/" "${file}.csv"
代码逻辑说明
- 首先通过
${rownum}地址匹配定位到指定行,只对该行做替换 - 正则部分
^\(\([^,]*\),\)\{$((col-1))\}匹配目标列之前的所有列和分隔符,保留到捕获组1 - 最后将目标列的原有内容替换为新值,前面的列保持不变
方案2:结合Field3唯一值校验(避免行号偏移改错)
因为你提到Field3为全局唯一值,用该值做匹配条件更稳妥,即使后续文件行序变化也不会改错行:
#!/bin/bash newvalue=3 # 待修改行的Field3唯一值,示例中对应行的Field3是7890 field3_val="7890" col=1 file="你的文件名" # Linux版本 sed -i "/,${field3_val}$/s/^\(\([^,]*\),\)\{$((col-1))\}[^,]*/\1${newvalue}/" "${file}.csv"
注意事项
以上方案仅适用于无引号包裹、字段内无逗号的简单CSV格式,如果你的CSV存在字段内带逗号、带转义引号的复杂场景,还是建议继续使用原本的awk方案,或者专门的CSV处理工具,sed没有内置CSV解析能力,处理复杂格式容易出错。
内容的提问来源于stack exchange,提问作者Helium
相关产品推荐
相关产品推荐

