使用 sed 替换大量文件中的 Windows 换行符 - 但它没有

Posted

技术标签:

【中文标题】使用 sed 替换大量文件中的 Windows 换行符 - 但它没有【英文标题】:Replace Windows newlines in a lot of files using sed - but it doesn't 【发布时间】:2012-08-28 20:38:28 【问题描述】:

我有很多以经典 ^M 结尾的文件,这是我 Windows 时代的产物。由于这都是源代码,git实际上认为这些文件发生了变化,所以我想一劳永逸地删除那些讨厌的行。

这是我创建的:

sed -i 's/^M//g' file

但这不起作用。当然,我没有输入文字^M,而是输入^V^M(ctrl V,ctrl M)。在 vim 中它可以工作 (:%s/s/^M//g) 如果我这样修改它:

sed -i 's/^M/a/g' file

它也有效,即它以'a'结束每一行。它也可以做到这一点:

sed -i 's/random_string//g' file

random_string 存在于file 中的位置。所以我可以用任何字符替换^M,我可以删除行但我不能删除^M。为什么?

注意:重要的是它只是被删除,而不是被另一个不可见的字符或其他东西替换。我还想避免双重执行并添加任意字符串并在之后将其删除。我想了解为什么会失败(但它不会报告错误)。

【问题讨论】:

字符在行尾吗?如果是这样,这可能会有所帮助:***.com/questions/64749/m-character-at-end-of-lines 您有什么特别的原因要为此使用sed 吗?运行dos2unix 似乎更容易。 (也就是说——你的sed -i 's/^M//g' file,使用^V^M 插入^M,对我来说很好。) 哦,我不知道这个工具。可能会更简单,我会检查一下,谢谢! 【参考方案1】:

该字符通过sed\r 匹配。使用:

sed -e "s/\r//g" input-file

【讨论】:

【参考方案2】:

就我而言,我不得不这样做

sed -e "s/\r/\n/g" filename.csv

在那之后wc -l filename 显示正确的输出而不是 0 行。

【讨论】:

以上是关于使用 sed 替换大量文件中的 Windows 换行符 - 但它没有的主要内容,如果未能解决你的问题,请参考以下文章

用sed 怎么替换包含换行符\n的文本.比如这些

如何批量执行sql查找替换?

sed:如果检查文件中存在代码块,则在大量文件上用另一个代码块替换一大块代码

如何使用 sed for windows(来自 cygwin)对 utf16 文件进行替换

求助sed命令匹配并替换无效的换行符

如何使用 vi or sed 将文件中的“\n" 替换成“\r\n