Bash sed:更换生产线末端

Bash sed:更换生产线末端,bash,sed,eol,Bash,Sed,Eol,我需要引用行的结尾,并使用解决方案来替换行的结尾,当文件有多行时,它可以很好地工作 当我尝试对没有\n或单行以\n结尾的文件使用此方法时,会出现问题。在这种情况下,sed不会替换任何内容,即使第二个s/命令也不起作用。看起来这条线的最后一个端点永远不会被替换 我的命令是: sed ':a;N;$!ba;s/\n/\\n/g;s/a/_/g' <file> 问题:为什么seconds/不替换Test1和Test2中的任何内容?是否有任何方法可以修复所有这些测试中s/\n/\\n/和s

我需要引用行的结尾,并使用解决方案来替换行的结尾,当文件有多行时,它可以很好地工作

当我尝试对没有
\n
或单行以
\n
结尾的文件使用此方法时,会出现问题。在这种情况下,
sed
不会替换任何内容,即使第二个
s/
命令也不起作用。看起来这条线的最后一个端点永远不会被替换

我的命令是:

sed ':a;N;$!ba;s/\n/\\n/g;s/a/_/g' <file>
问题:为什么second
s/
不替换Test1和Test2中的任何内容?是否有任何方法可以修复所有这些测试中
s/\n/\\n/
s/a/\ug
的替换

注意:我不想在sed处理之前在流的末尾添加换行符,然后在sed处理之后删除换行符

EDIT:看起来像是
N
命令不读取单行,即使它后面跟着“\N”。知道怎么修吗


EDIT2:似乎是这样。关于如何替换最后一行结尾,有什么方法吗?

可以改用
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

你能改用
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
这可能适用于您(GNU-sed):

或:

从逻辑上讲,这是有道理的:如果你在
最后一行,你就不能得到
下一行

或:


从逻辑上讲,这是有道理的:如果您在
最后一行,则无法获得
下一行

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

这是解决方案的最终解决方案:

sed ':a;$!{N;ba};s/\n/\\n/g;s/a/_/g' <<< "$VAR" | tr -d '\n'
附言:谢谢波通算出了
:a;$!{N;ba}


p.p.S.:如果有人在没有
tr
的情况下给出工作答案,我将重新接受它。

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

这是解决方案的最终解决方案:

sed ':a;$!{N;ba};s/\n/\\n/g;s/a/_/g' <<< "$VAR" | tr -d '\n'
附言:谢谢波通算出了
:a;$!{N;ba}



p.p.S.:如果有人没有给出工作答案,我会重新接受。

我最近使用了这个:sed'{:q;N;S/\N/\u/g;t q}你试过分离sed部分吗<代码>sed”:a;N、 美元!ba'| sed's/\n/\\n/g;s/a/\uG'
或类似。这没有帮助,因为它等于
cat | sed's/\n/\\n/g;s/a/\uG'
。使用
连接行:a;N、 美元!ba'
仅在一个sed进程内工作。
sed:a;N、 美元!文学士;s/\n/\\n/g'| sed's/a/\ug'
?或者我没什么建议了,对不起。谢谢,但这并不能代替下线。不幸的是,这并不能解决问题本身。我最近使用了它:sed'{:q;N;s/\N/u/g;tq}您尝试过分离sed部分吗<代码>sed”:a;N、 美元!ba'| sed's/\n/\\n/g;s/a/\uG'
或类似。这没有帮助,因为它等于
cat | sed's/\n/\\n/g;s/a/\uG'
。使用
连接行:a;N、 美元!ba'
仅在一个sed进程内工作。
sed:a;N、 美元!文学士;s/\n/\\n/g'| sed's/a/\ug'
?或者我没什么建议了,对不起。谢谢,但这并不能代替下线。不幸的是,这本身并不能解决问题。Bash是首选。不想只为一个大于30的脚本添加新的依赖项。@loentar您的输入中是否有未出现的字符:)对不起,“预期结果”中有拼写错误,您的第二个正则表达式应该看起来像
的/a//;'
,也可以组合成单个参数:
perl-pe的/\n$/\\n/g;s/a/\uG'
。无论如何,谢谢你的回答。强烈建议使用Bash。不想只为一个大于30的脚本添加新的依赖项。@loentar您的输入中是否有未出现的字符:)对不起,“预期结果”中有拼写错误,您的第二个正则表达式应该看起来像
的/a//;'
,也可以组合成单个参数:
perl-pe的/\n$/\\n/g;s/a/\uG'
。谢谢你的回答。谢谢你的回答。我理解逻辑。遗憾的是,它没有将行的最后一个结尾替换为“\\n”(Test2和Test3)。可能没有办法使
N
读取不要跳过最后一行。因为它无法读取不存在的行,所以只需添加一行即可`sed':a;$!{N;ba};Gs/\n/\\n/g;s/a/ug/g’文件不幸的是,这总是在源流中添加新行,所以Test1失败。此外,它不会删除最后一行,因此所有测试都失败。谢谢您的回答。我理解逻辑。遗憾的是,它没有将行的最后一个结尾替换为“\\n”(Test2和Test3)。可能没有办法使
N
读取不要跳过最后一行。因为它无法读取不存在的行,所以只需添加一行即可`sed':a;$!{N;ba};Gs/\n/\\n/g;s/a/ug/g’文件不幸的是,这总是在源流中添加新行,所以Test1失败。此外,它不会删除最后一行,因此所有测试都失败。
sed ':a;$!{N;ba};s/\n/\\n/g;s/a/_/g' <<< "$VAR" | tr -d '\n'
$ 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|