sed 无意中改变了 Windows 行结尾。我怎样才能避免这种情况?

sed 无意中改变了 Windows 行结尾。我怎样才能避免这种情况?

我正在 Linux 中开发一个便携式应用程序,其中我想从一些具有 Windows 样式行结尾的源文件中删除尾随空格。行结尾不应更改为 unix。

使用“sed”的代码非常简单,可以在网上找到:

sed -i.bak -E 's/[[:space:]]+$//' myfile

问题是,操作后,diff表明文件中的所有行(以及生成的 .bak)都不同。这当然不可能是真的。该特定文件只有 1 行且尾随空格。

使用 hexdump (我使用的od -x myfile)实用程序检查,很明显原始文件的第一行以“0d0a”结尾,而在 sed 编辑的文件中它以“0a”结尾。

我无法找到有关如何在不影响行结尾的情况下执行尾随空格删除的任何信息。有办法吗?

如果“回车”字符是“[[:space:]]”正则表达式组的一部分,那么也许这个

sed -i.bak -E 's/[ \t]+$//' myfile

应该管用。但事实并非如此——它创建了一个相同的文件。我还尝试过“-e”标志,甚至根本没有标志。生成的文件仍然与原始文件相同,并且没有删除尾随空格。

答案1

是的,(\r = ^M = 0x0D) 字符属于space“字符类”。在你的第二个正则表达式中允许它,或者使用通配符:

sed -i.bak -E 's/[ \t]+.$/\r/' myfile

或特定的字符,例如

sed -i.bak -E 's/[ \t]+\r$/\r/' myfile

如果您sed不认识该\r符号,请尝试其他符号。像十六进制\x0D或八进制\015

相关内容