求助:如何编写调用sed的foreach脚本?附相关代码示例
问题修正与排查指导
首先你的核心问题出在xsed文件的内容完全错误:sed -f指定的脚本文件里必须写sed的编辑指令,而不是shell命令(你现在写的gsed -f xsed $f > tp.$f.tp是shell命令,sed根本认不出)。
1. 修正foreach脚本(适用于csh/tcsh)
原脚本语法基本没问题,但建议加上文件名后缀的点(避免匹配到非csv后缀的文件),同时用双引号包裹变量,防止文件名含空格时出错:
foreach f (*.csv) sed -f xsed "$f" > "tp.$f.tp" end
如果你的环境里只有GNU sed(比如macOS上装的gsed),把上面的sed换成gsed即可。
2. 正确编写xsed脚本文件
xsed里要写纯sed指令,举几个常见例子:
- 替换逗号为制表符:
s/,/\t/g - 删除空行:
/^$/d - 提取第一列(以逗号分隔):
s/,.*//
你需要根据自己的实际编辑需求来写对应的sed指令,而不是写shell命令。
3. 排查步骤
- 先单独测试sed命令:拿一个测试csv文件,直接运行
sed -f xsed test.csv,看输出是否符合预期,没问题再批量处理。 - 检查xsed的换行符:如果是Windows格式的CRLF换行,sed可能解析出错,用
dos2unix xsed转换成Unix格式的LF换行。 - 确认sed版本兼容性:BSD sed(比如macOS默认)和GNU sed部分语法不同,如果你用了GNU sed的特性(比如扩展正则的
-E),要确保脚本里用的是gsed,或者加上对应参数。
内容的提问来源于stack exchange,提问作者Lester Ingber
相关产品推荐
相关产品推荐

