为什么翻译工作而不是 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给出的解决方案。
我想用 #
之类的东西替换换行符我试过 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给出的解决方案。