我有几个要替换的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问题?
答案 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
删除它们。