回车、LineFeed 和 Sed 行为

回车、LineFeed 和 Sed 行为

我需要理解为什么 sed 能够适用于 1) 而不能适用于 2)。请不要向我发布任何替代解决方案。我已经在这个论坛上找到了它们。我只需要了解 sed 关于第 1) 点和第 2) 点的行为。

1)sed -i s/\\r//g file.txt

在检查 od -c file.txt 时,sed 已成功删除 \r

2)sed -i s/\\n//g file.txt

在检查 od -c file.txt 时,sed 尚未删除 \n

我的问题是想了解为什么它不适用于第 2 点。请不要发布任何替代解决方案。想要了解内部原理就是这样!

答案1

GNU sed 手册 - sed 的工作原理

sed 通过对每一行输入执行以下循环进行操作:首先,sed 从输入流中读取一行,删除任何尾随换行符,并将其放置在模式空间中。然后执行命令;每个命令都可以有一个与其关联的地址:地址是一种条件代码,只有在执行命令之前验证了条件,才会执行命令。

当到达脚本末尾时,除非使用 -n 选项,否则模式空间的内容将打印到输出流,如果删除了尾随换行符,则重新添加它。然后下一个循环开始下一个输入行。

POSIX 规范(谢谢钢铁起子对于链接)

在默认操作中,sed 循环应附加一行输入,减去其终止换行符,进入模式空间。通常,模式空间将为空,除非 D 命令终止最后一个周期。然后,sed 实用程序应按顺序应用其地址选择该模式空间的所有命令,并在脚本末尾将模式空间复制到标准输出(指定 -n 时除外)并删除该模式空间。每当模式空间写入标准输出或命名文件时,sed 将立即跟随换行符


太长了;博士输入记录分隔符(默认为换行符)在执行命令之前被删除,然后在打印记录时添加回来


然而,在某些情况下可以操纵换行符。下面给出一些示例:

$ # this would still not allow newline of second line to be manipulated
$ seq 5 | sed 'N; s/\n/ : /'
1 : 2
3 : 4
5

$ # here ASCII NUL is input record separator, so newline can be freely changed
$ seq 5 | sed -z 's/\n/ : /g'
1 : 2 : 3 : 4 : 5 :  

$ # default newline separator, so NUL character can be changed
$ printf 'foo\0baz\0xyz\0' | sed 's/\x0/-/g'
foo-baz-xyz-
$ # NUL character is separator, so it cannot be changed now
$ printf 'foo\0baz\0xyz\0' | sed -z 's/\x0/-/g' | cat -A
foo^@baz^@xyz^@

答案2

的文件sed是由 分隔的行流\n。如果\n是分隔符,当然不能用替换来处理。

相关内容