sed执行正常,除非在读取脚本时:替换命令中的bad flag:'s'

时间:2017-04-11 03:00:35

标签: excel bash macos sed

我有几个要替换的100个源文件和22,000个变量名。在文件ReplaceScript中使用替换变量创建了一个sed脚本,如下所示:

#! /usr/bin/sed -f
s/foo1/bar1/g
s/foo2/bar2/g
s/foo3/bar3/g

需要替换树中所有.c文件中的变量名。在要搜索的基目录中,我使用了以下命令:

find . -type f -name "*.c" -exec sed -i '' -f ./ReplaceScript {} +
sed: 1: ./ReplaceScript: bad flag in substitute command: 's'

单个替换命令按预期工作:

find . -type f -name "*.c" -exec sed -i '' 's/foo1/bar1/g' {} +

我的问题:如何修复我的坏旗?

更新

使用GNU sed会导致不同的错误:

find . -type f -name "*.c" -exec /usr/local/bin/sed -i -f ./ReplaceScript {} +
/usr/local/bin/sed: file ./ReplaceScript line 1: unknown option to `s'

更新

事实证明是两个问题: 1. DOS回车而不是unix回车。 2. little endian UTF 16文件格式,sed必须是ASCII才能正确解析。

更新2 重复?对于另一个问题的答案相同,顶部有额外的UTF 16问题?

2 个答案:

答案 0 :(得分:1)

问题出在脚本文件中的DOS回车中。从Excel工作表中导出了Space Delimited Text .prn,结果是使用DOS / Windows回车。这些不会显示在文本编辑器中,只有当您将脚本文件显示为^ M时才会显示。当unix sed解释它们时,那​​些小小的帽子会引起问题。

本论坛其他地方发布的解决方案:安装dos2unix;指示vim使用命令文件格式转换为unix;替换模式;他们都不适合我。我现在仍然从Excel导出并粘贴到TextWrangler。

评论表明我发布的代码没有显示任何问题,是导致解决方案的原因。感谢大家为我在这个论坛上的第一篇文章做出贡献。

答案 1 :(得分:1)

基于this comment ,该文件采用UTF-16编码,采用带有字节顺序标记的小端格式。尝试在其上运行以下命令将其转换为ASCII:

iconv -f UTF-16 -t ASCII ReplaceScript > ReplaceScript-new

我注意到它也有回车。 sed在我的机器上看起来似乎没问题,但是如果它们给你带来问题,你可以轻易地用dos2unix删除它们。