使用 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:如果检查文件中存在代码块,则在大量文件上用另一个代码块替换一大块代码