如何使用sed或regex合并多个块/行?

问题描述 投票:-1回答:4

是否可以将多个块/行合并为“单个”行?所以基本上如果下一行以相同的“#Msg”标签开头,则将其附加到上一行。 (很难解释,但我的例子说明了自己)(块由一个新的/空白行分隔)

我的输入文件如下所示:

#Msg,00000

#Msg,00001
#Msg,00002

#Msg,00003
#Msg,00004

#Msg,00005

#Msg,00006
#Msg,00007
#Msg,00008

#Msg,00009

#Msg,00010
#Msg,00011

输出应该是这样的:

#Msg,00000

#Msg,00001 #Msg,00002

#Msg,00003 #Msg,00004

#Msg,00005

#Msg,00006 #Msg,00007 #Msg,00008

#Msg,00009

#Msg,00010 #Msg,00011

任何建议都非常欢迎。

regex sed merge
4个回答
0
投票

在Perl中这很容易做到:

perl -00 -ple 'tr/\n/ /'

-e CODE指定了该计划。

-p在它周围包装一个读/写行循环(默认情况下,它从STDIN读取,但您也可以在命令行上指定一个或多个文件名)。

-00指定输入“行”实际上是段落。

-l有两个效果:传入的行终止符会自动从行中删除,并且传出行会添加行终止符(因为我们使用了-00(段落模式),我们的行终止符实际上是\n\n)。

回顾一下:

我们一次阅读一段输入。对于每个段落,我们删除任何尾随换行符。然后我们将每个换行符翻译成一个空格。最后我们输出转换后的段落,然后输出\n\n


0
投票

尝试生成比Perl更短的代码没有意义!

从列表group中的输入文件中收集行,直到出现空行。然后输出group的内容,清空它并重新开始。遇到文件结尾时输出group中的任何内容,如果它是非空的。

group = []
with open('vollschauer.txt') as vollschauer:
    for line in vollschauer:
        line = line.rstrip()
        if line:
            group.append(line)
        else:
            if group:
                print (' '.join(group))
                print()
                group = []
if group:
    print (' '.join(group))
    group = []

0
投票
$ awk -v RS= -v ORS='\n\n' '{$1=$1}1' file
#Msg,00000

#Msg,00001 #Msg,00002

#Msg,00003 #Msg,00004

#Msg,00005

#Msg,00006 #Msg,00007 #Msg,00008

#Msg,00009

#Msg,00010 #Msg,00011

0
投票

如果你坚持使用sed,这应该可以解决问题:

sed -r ':a; N; /^(#[^,]+,).*\n\1/! { P; D }; s/\n/ /; ba' file

它需要考虑不同的标签。这些标签不会组合在一起(这就是我所理解的所需行为):

$ cat file
#Msg,00000
#Msg,00001
#Hello,00002

#Hello,00003
#What,00004
#What,00005
$ sed -r ':a; N; /^(#[^,]+,).*\n\1/! { P; D }; s/\n/ /; ba' file
#Msg,00000 #Msg,00001
#Hello,00002

#Hello,00003
#What,00004 #What,00005

请注意,此解决方案使用GNU sed

© www.soinside.com 2019 - 2024. All rights reserved.