在普通的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.|