更改文件中的字符串出现次数,同时尊重 DOS 新行序列

更改文件中的字符串出现次数,同时尊重 DOS 新行序列

我使用 Visual Studio 进行 C# 开发,同时使用 Cygwin 完成一些需要脚本编写的任务。最近,我想将项目文件中所有出现的字符串更改AAA为。BBB我从旧的可信赖的开始sed,但令我沮丧的是,它将 DOS 新行序列更改为 Unix 行序列。

这是我使用的:

sed -i 's/AAA/BBB/g' $(grep -rl AAA /cygdrive/c/project_path)

似乎没有sed开关可以做我想要的事情。还有其他 Unix 工具可以帮助我吗?

编辑:在 C# 文件之间还有一些其他脚本具有 Unix 换行符。这个工具最好不要将它们更改为 DOS 版本。 :)

答案1

VS 中必须有一个内置函数。

如果没有,你可以使用旧的vi

vi +'bufdo %s/AAA/BBB/g | update' +q $(grep -rl AAA /cygdrive/c/project_path)

答案2

您可以使用 Cygwin 的 perl 代替。典型的 sed 命令很容易映射到 Perl。请注意,正则表达式语法不同(Perl 中的扩展正则表达式,sed 中的基本正则表达式)。

perl -i -pe 's/AAA/BBB/g' $(grep -rl AAA /cygdrive/c/project_path)

请注意,将命令替换的结果解析为文件列表是很脆弱的。如果文件名中有空格或反斜杠,它就会中断;两者在 Windows 下都相当常见(当路径尚未从本机转换为 cygwin 时,例如当它来自环境变量时,您会得到反斜杠)。请使用xargs -d '\n'(Windows 文件名中没有换行符)。

grep -rl AAA /cygdrive/c/project_path | xargs -d '\n' perl -i -pe 's/AAA/BBB/g'

相关内容