0

我需要引用行尾并使用解决方案替换行尾,当文件有多行时它可以完美地工作。

当我尝试将此方法用于没有\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"

问题:为什么 seconds/不能替换 Test1 和 Test2 中的任何内容?有什么方法可以修复所有这些测试的替换s/\n/\\n/和替换?s/a/_/g

PS:我不想要一些解决方法,例如在 sed 处理之前在流末尾添加换行符并在之后删除它。

编辑:看起来N命令不读取单行,即使它后面跟着'\ n'。知道如何解决吗?

EDIT2:似乎这是command的预期行为N。有什么方法可以替换最后一行结尾吗?

4

3 回答 3

3

这可能对您有用(GNU sed):

sed ':a;$!{N;ba};s/\n/\\n/g;s/a/_/g' file

或者:

sed ':a;$!N;$!ba;s/\n/\\n/g;y/a/_/' file

next从逻辑上讲,这是有道理的:如果您在线,则无法接听last电话。

于 2013-08-16T15:16:51.973 回答
2

可以perl改用吗?

$ echo -n "abc" | perl -pe 's/\n$/\\n/;' -pe 's/a/_a/;' | od -x
0000000 615f 6362
0000004
$ echo "abc" | perl -pe 's/\n$/\\n/;' -pe 's/a/_a/;' | od -x
0000000 615f 6362 6e5c
0000006
$ echo -e 'abc\n' | perl -pe 's/\n$/\\n/;' -pe 's/a/_a/;' | od -x
0000000 615f 6362 6e5c 6e5c
0000010
于 2013-08-16T10:54:43.583 回答
0

伤心,但我没有找到任何方法来阻止 sed 在N使用命令时向输出添加新行。我不想在处理之前添加新行并在之后删除它,但似乎没有其他方法。

这是具有解决方法的最终解决方案:

sed ':a;$!{N;ba};s/\n/\\n/g;s/a/_/g' <<< "$VAR" | tr -d '\n'

<<<像 echo 在输入字符串中添加新行,tr将其删除。

使用该行,所有测试都可以:

$ echo -e "abc" | sed ':a;$!{N;ba};s/\n/\\n/g;s/a/_/g' | tr -d '\n' | hexdump -C
00000000  5f 62 63                                          |_bc|

$ echo -e "abc\n" | sed ':a;$!{N;ba};s/\n/\\n/g;s/a/_/g' | tr -d '\n' | hexdump -C
00000000  5f 62 63 5c 6e                                    |_bc\n|

$ echo -e "abc\n\n" | sed ':a;$!{N;ba};s/\n/\\n/g;s/a/_/g' | tr -d '\n' | hexdump -C
00000000  5f 62 63 5c 6e 5c 6e                              |_bc\n\n|

PS:感谢 potong 弄清楚:a;$!{N;ba}.

PPS:如果有人会在没有 的情况下给出有效的答案tr,我会重新接受。

于 2013-08-19T06:23:45.147 回答