保留行尾


111

我运行sed在Windows上做了一些替换,我注意到它会自动将行尾转换为Unix(\ n)。是否有选项告诉sed使用Windows行尾(\ r \ n)甚至更好地保留文件中的行尾?

注意:我使用来自unxutils的sed:http ://unxutils.sourceforge.net/


2
以下解决方案不适用于macOS。
William Entriken

我甚至能走到今天,它仍然没有工作LC_ALL=C perl -i -e 'binmode $STDIN;undef $/;$_=<>;s|http://911coned.com|https://911coned.com|gm;print' education.html
威廉Entriken

因此,实际上上述命令确实有效,我只是在git diff程序中发现了一个错误。
William Entriken '17

1
您可以使用sed(不带任何特殊选项)+ unix2dos
mems,

Answers:


143

您可以使用-bsed选项将其视为二进制文件。这将解决Windows上cygwin的sed的问题。

例: sed -b 's/foo/bar/'

如果要匹配行尾,请记住匹配,捕获并复制可选的回车符。

例: sed -b 's/foo\(\r\?\)$/bar\1/'

sed手册页中

-b --binary

该选项在每个平台上都可用,但是仅在操作系统区分文本文件和二进制文件的情况下才有效。当进行这种区分时(如MS-DOS,Windows和Cygwin一样),文本文件由由回车符和换行符分隔的行组成,而sed看不到结尾的CR。指定此选项后,sed将以二进制模式打开输入文件,因此不要求进行特殊处理,并考虑以换行结尾的行。


5
请注意,这不适sed -i用于cygwin(对我而言),但是您可以解决此问题。感谢您的更新-其他答案是该主题在一段时间内的最后决定。
harpo 2012年

注意,此选项不适用于Mac上的sed。
Senthil Kumaran 2013年

21
即使对我也有用sed -i:键入非常重要。虽然sed -bised -i -b工作中,sed -ib确实没有工作:看到为什么(使用手册页b为后缀的备份副本)。
奥拉夫·曼德尔

2
使用:sed -bi 's/foo/bar/'
库纳尔B.15年

2
在Windows cygwin中对我不起作用。在sed进行更改的行上,行结尾为Unixy。其余的行具有Windowish的行尾。因此,我的文件混合了行尾不同的行。
Trueadjustr

10

您可以尝试在现有脚本的末尾将\nfor 替换为sub,\r\n如下所示:

sed 's/foo/bar/;s/$/\r/'

也许

 sed -e 's/foo/bar/' -e 's/$/\r/'

如果以上两种方法都不起作用,则必须查阅您所用版本的特定手册页,sed以查看是否存在这样的选项。注意的* nix的版本sed没有改变行终止,而不被告知这样做。

另一种方法是使用cygwin的版本,sed不应该有这种不良行为。


15
cygwin版本确实具有这种不良行为。
harpo 2011年

2
如果文件同时包含\ n(0x0A)和\ r \ n(0x0D 0x0A)-建议的解决方案(始终重新注入\ r)会破坏该文件。
弗拉德(Vlad)

这对我使用MSYS2 / MinGW起作用。谢谢@SiegeX。
AntumDeluge

6

或者,(的cygwin版本)perl -pe似乎没有此问题。


在MacOS上的sed没有-b选项,并且具有与原始问题中所述类似的问题。perl选项没有这个问题,因此感谢您的建议。 sed -i -e 's/<img[^>]*\/>//g' *.xml用'\ n'替换行尾以 perl -i -p -e 's/<img[^>]*\/>//g' *.xml保留原始行尾
Guruniverse '17

2

如果仅指定-b开关并重定向,则可以抑制Gnuwin弄乱换行符(win-> unix)。使用-i(内联)开关会将其弄乱。

例如sed.exe -b“ s / \ xFF \ xFE //” c:\ temp \ in.csv> c:\ temp \ out.csv


1
-i我的答案中看到具有工作模式的版本。
Vadzim

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.