在普通的Windows到Unix转换中,您可以执行sed s/\r//g之类的操作,该操作从流中删除\ r字符。

但是我正在尝试转换可能是mac编码(\ r)或Windows编码(\ r \ n)的文件的结尾。所以我不能只删除\ r,因为它将删除mac结尾。我必须先“规范化”行尾字符。此规范化步骤从\ r \ n转换为\ r(此后,我将\ r转换为\ n)。但是,我无法使用sed解决此步骤。我尝试过这样的事情:

$> echo -e "foo\r\nbar" | sed 's/\r\n/\r/g' | xxd -c 24 -g 1
00000000: 66 6f 6f 0d 0a 62 61 72 0a            foo..bar.


我可以这样用bbe解决它:

$> echo -e "foo\r\nbar" | bbe -e 's/\r\n/\r/g' | xxd -c 24 -g 1
00000000: 66 6f 6f 0d 62 61 72 0a               foo.bar.


sed是否可以做同样的事情?

最佳答案

默认情况下,sed分割\n上的输入,因此\n永远不会出现在模式空间中。但是,如果使用的是GNU sed,则可以使用-z/--null-data选项使sed将输入视为NUL字符分隔的行:

$ echo -e "foo\r\nbar" | sed -z 's/\r\n/\r/g' | hd
00000000  66 6f 6f 0d 62 61 72 0a                           |foo.bar.|


另外,在POSIX sed中,可以将所有行追加到模式空间(循环中带有N command),有效地将整个文件复制到模式空间,然后进行替换:

$ echo -e "foo\r\nbar" | sed -n ':a;N;ta; s/\r\n/\r/g; p' | hd
00000000  66 6f 6f 0d 62 61 72 0a                           |foo.bar.|

10-07 19:00
查看更多