sed命令批量编辑CSV追加列时字符串换行问题求助
修正CSV文件追加列的sed命令问题
需要批量给目标目录下的CSV文件添加ORIGIN_FILE和WRITE_DATE两列,但执行原bash命令时,追加的字符串总是出现在新行而非当前行末尾。
输入CSV示例
PRODUCT, QUANTITY, PRICE ITEM1, 4.8, 380.33 ITEM2, 2.3, 120.50 ITEM3, 1.5, 210.11
原执行命令
find $target_dir -type f -name "*.csv" | parallel sed -i '\'1s/$/,ORIGIN_FILE,WRITE_DATE/; 2,$s/$/,myfilename.csv,2022-11-24/\'' {}'
错误输出
PRODUCT, QUANTITY, PRICE, ORIGIN_FILE, WRITE_DATE ITEM1, 4.8, 380.33 myfilename.csv, 2022-11-24 ITEM2, 2.3, 120.50 myfilename.csv, 2022-11-24 ITEM3, 1.5, 210.11 myfilename.csv, 2022-11-24
期望输出
PRODUCT, QUANTITY, PRICE, ORIGIN_FILE, WRITE_DATE ITEM1, 4.8, 380.33, myfilename.csv, 2022-11-24 ITEM2, 2.3, 120.50, myfilename.csv, 2022-11-24 ITEM3, 1.5, 210.11, myfilename.csv, 2022-11-24
修正后的命令
find "$target_dir" -type f -name "*.csv" | parallel sed -i '1s/$/, ORIGIN_FILE, WRITE_DATE/; 2,$s/$/, {/.}, '"$(date +%Y-%m-%d)"'/' {}
关键修正点:
- 修复转义混乱:原命令的引号和转义处理错误,导致sed解析时将追加内容拆分为新行。改用单引号直接包裹sed脚本,避免不必要的转义。
- 动态获取文件名:用
{/.}让parallel自动替换为当前处理文件的文件名(不带路径),替代原命令里的固定值myfilename.csv。 - 日期处理:用
date +%Y-%m-%d动态生成当前日期,若需要固定日期,直接替换为'2022-11-24'即可。 - 格式统一:在追加内容前添加空格,与原CSV的格式保持一致。
内容的提问来源于stack exchange,提问作者Reynaldo Chester Jr. de Alday
相关产品推荐
相关产品推荐

