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

时间:2017-12-29 22:18:12

标签: regex sed merge

是否可以将多个块/行合并为一个"单个"线? 所以基本上如果下一行以相同的"#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

输出应该是这样的:

separate

非常欢迎任何建议。

5 个答案:

答案 0 :(得分:0)

在Perl中这很容易做到:

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

-e CODE指定程序。

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

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

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

回顾一下:

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

答案 1 :(得分: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 = []

答案 2 :(得分: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

答案 3 :(得分: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

答案 4 :(得分:0)

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

sed ':a;N;/^$/M!s/\n/ /;ta' file

聚集行,将每个换行符替换为一个空格,直到空行为止。

在repexp M上使用/^$/标志,该标志与包含多行的模式空间中的空行匹配。