gpt4 book ai didi

sed - 为什么 sed 's/\r\n/\r/g' 没有按预期工作?

转载 作者:行者123 更新时间:2023-12-02 09:47:14 28 4
gpt4 key购买 nike

在正常的 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.|

关于sed - 为什么 sed 's/\r\n/\r/g' 没有按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47516058/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com