我需要引用行尾并使用this解决方案来替换文件有多行时完美工作的行尾。sed:替换行尾
当我尝试使用这种方法的文件没有\n
或单行以\n
结尾时出现问题。在这种情况下,sed
不会取代任何内容,即使第二个s/
命令也不起作用。也看起来像线的末尾永远不会被取代。
我的命令是:
sed ':a;N;$!ba;s/\n/\\n/g;s/a/_/g' <file>
(取代\n
到\\n
和替换a
到_
例如)。
我用hexdump -C
在这里显示的文件:
有测试我做:
$ # Test1. single line without \n
$ echo -n 'abc' | sed ':a;N;$!ba;s/\n/\\n/g;s/a/_/g' | hexdump -C
00000000 61 62 63 |abc|
# but expected "_bc"
$ # Test2. single line with \n
$ echo 'abc' | sed ':a;N;$!ba;s/\n/\\n/g;s/a/_/g' | hexdump -C
00000000 61 62 63 0a |abc.|
# but expected "_bc\n"
$ # Test3. two lines
$ echo -e 'abc\n' | sed ':a;N;$!ba;s/\n/\\n/g;s/a/_/g' | hexdump -C
00000000 5f 62 63 5c 6e 0a |_bc\n.|
# but expected "_bc\n\n"
问题:为什么第二s/
不能取代的Test1和Test2的东西吗?在所有这些测试中,是否有任何方法可以修复替换s/\n/\\n/
和s/a/_/g
?
P.S .:我不想要一些解决方法,比如在sed处理之前在流尾添加换行符,并在删除之后删除它。
编辑:看起来像N
命令不会读取单行,即使它后跟'\ n'。任何想法如何解决它?
编辑2:看起来像这样是expected behavior of N
command。有没有什么方法可以取代最后一行的结尾?
我最近使用过这个:sed'{:q; N; s/\ n/_/g; t q}' – svante
您是否尝试过分离sed部分? 'sed':a; N; $!ba' | sed的/ \ n/\\ n/g; s/a/_/g''或类似的。 –
svante
这没有帮助,因为它等于'cat | sed's/\ n/\\ n/g; s/a/_/g''。使用'':a; N; $!ba''连接线正在一个sed过程中工作。 –
loentar