使用sed将一行的结尾附加到下一行的开头

使用sed将一行的结尾附加到下一行的开头,sed,Sed,我正在寻找以下方面的sed唯一解决方案: 损坏的输入: A 123 dgbsdgsbg A 345 gsgsdgdgs A 23 2 afaffaaf A 324 fsgdggsdg A 345 avsa fasf 预期产出: A 123 dgbsdgsbg A 345 gsgsdgdgs A 232 afaffaaf A 324 fsgdggsdg A 345 avsafasf 如何将尾随的A[0-9].*追加到下一行的开头。到目前为止,我已经: $ sed -r 's/ (A [0-9]

我正在寻找以下方面的
sed
唯一解决方案:

损坏的输入:

A 123 dgbsdgsbg
A 345 gsgsdgdgs A 23
2 afaffaaf
A 324 fsgdggsdg A 345 avsa
fasf
预期产出:

A 123 dgbsdgsbg
A 345 gsgsdgdgs
A 232 afaffaaf
A 324 fsgdggsdg
A 345 avsafasf
如何将尾随的
A[0-9].*
追加到下一行的开头。到目前为止,我已经:

$ sed -r 's/ (A [0-9]+.*)/\n\1/' file
A 123 dgbsdgsbg
A 345 gsgsdgdgs
A 23
2 afaffaaf
A 324 fsgdggsdg
A 345 avsa
fasf
这可以是一个选项:

$ sed -r ':a;$!N;s/ (A [0-9]+.*)\n(.*)/\n\1\2/;ta;P;D' file
A 123 dgbsdgsbg
A 345 gsgsdgdgs
A 232 afaffaaf
A 324 fsgdggsdg
A 345 avsafasf
这是对上一个示例的改编:

您是否尝试过:

sed -e :a -e '$!N;s/\([0-9]\)\n\([0-9]\)/\1\2/;ta' -e 'P;D'
例如:

$ cat input
abc 123
456
def
123
ghi 123
jkl 456
789
$ sed -e :a -e '$!N;s/\([0-9]\)\n\([0-9]\)/\1\2/;ta' -e 'P;D' input
abc 123456
def
123
ghi 123
jkl 456789
编辑:您在后面的问题中修改了示例。对于修改后的输入,请尝试:

$ sed -e 's/ \(A .*\)/\n\1/' -e :a -e '$!N;s/\n\([^A]\)/\1/;ta' -e 'P;D' newinput
A 123 dgbsdgsbg
A 345 gsgsdgdgs
A 232 afaffaaf
A 324 fsgdggsdg
A 345 avsafasf
这可能适用于您(GNU-sed):


Et tu,@devnull这是一种问题,我的大脑除了替换和其他一些技巧之外,还会切换到
awk
。我的
sed
知识不会传播。请解释一下
$!N
P;D
?@sudo\u O
$!N
表示如果不是文件结尾,则在模式空间中的当前行追加一个换行符(
\N
)和下一行
P
表示打印到第一个换行符或图案空间的末端(以先到者为准),删除到并包括第一个换行符或图案空间的末端(以先到者为准)
D
导致在删除前,如果模式空间中存在换行符,则自动读入下一行,直到未找到换行符为止。
$ sed -e 's/ \(A .*\)/\n\1/' -e :a -e '$!N;s/\n\([^A]\)/\1/;ta' -e 'P;D' newinput
A 123 dgbsdgsbg
A 345 gsgsdgdgs
A 232 afaffaaf
A 324 fsgdggsdg
A 345 avsafasf
 sed -r '$!N;s/ (A[^\n]*)\n/\n\1/;P;D' file