为什么翻译工作而不是 sed 换行

Why is translate working and not sed for line feed

我想用 #

之类的东西替换换行符

我试过 sed 但 \n 不起作用,\x0a 也是如此

我得到了文件 z1

cat z1|hd

00000000  30 0a 61 0a 0a 31 0a 62  0a 0a 32 0a 63 0a        |0.a..1.b..2.c.|

如果我尝试

cat z1|sed $'s/\x30//g' 

一切都很好

但是在sed中换行不起作用,只是一个错误信息

cat z1|sed $'s/\x0a//g' 

如果我尝试

cat z1| tr "\n" "#"|hd

换行一切正常

为什么 sed 不能换行?

sed 版本接受 \n 或十六进制字符代码,但这不可移植。如果您不能使用 tr(为什么不呢?),那么也许可以探索 Perl,它当然不是标准的,但几乎随处可用;并且因为只有一种实现,所以它可以在任何 Perl 可用的地方工作。

perl -pe 'y/\n/#/' z1

另请注意缺少 useless cat.

这可能适合您 (GNU sed):

sed '1h;1!H;$!d;x;y/\n/#/' file

这会将文件写入内存,然后将 \n 转换为 #

选择:

sed -z 'y/\n/#/' file

sed 不会匹配文字换行符,因为 sed 中的命令由换行符分隔。所以 sed,当解析命令时,看到一个换行符并假定它是这个命令的结尾。然后 sed 语法错误的错误,因为 s/ 是一个无效的命令, s 需要三个分隔符,这里是 / 。更具体地说,posix sed documentation 明确禁止在 BRE 中的 s/BRE/replacement/flags 命令中嵌入文字换行符:A literal <newline> shall not be used in the BRE of a context address or in the substitute function.

除此之外,sed 逐行解析输入,但忽略输入中的换行符并在打印时自动附加换行符。所以即使你做了 s/\n/#/ 它也不会做任何事情,因为输入中没有换行符。您可以:将所有行附加到 hold space,然后将 hold space 切换为模式 space,然后替换换行符。这是@potong给出的解决方案。