是否可以将多个块/行合并为一个"单个"线? 所以基本上如果下一行以相同的"#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
非常欢迎任何建议。
答案 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
上使用/^$/
标志,该标志与包含多行的模式空间中的空行匹配。