我发现了几个相关的问题,但它们都不符合我的需要,因为我是一个真正的初学者,我无法弄清楚。
我有一个包含这样的条目的文本文件,用空行分隔:
example entry &with/ special characters
next line (any characters)
next %*entry
more words
我想输出合并行,在逗号之间插入逗号,并删除空行。即,示例应如下所示:
example entry &with/ special characters, next line (any characters)
next %*entry, more words
我更喜欢sed,因为我知道它有点,但我也对linux命令行上的任何其他解决方案感到高兴。
答案 0 :(得分:8)
改进了Kent的优雅建议:
awk 'BEGIN{RS="";FS="\n";OFS=","}{$1=$1}7' file
允许每个块有任意数量的行,而不是每个块有2个刚性行。谢谢你,肯特。 注意:7
是肯特的商标......任何非零表达式都会导致awk
打印整个记录,他喜欢{{1} }。
您可以使用7
:
awk
将记录分隔符设置为空行,将字段分隔符设置为换行符,将输出字段分隔符设置为逗号。
<强>输出:强>
awk 'BEGIN{RS="";FS="\n";OFS=","}{print $1,$2}' file
答案 1 :(得分:2)
简单sed
命令,
sed ':a;N;$!ba;s/\n/, /g;s/, , /\n/g' file
:a;N;$!ba;s/\n/, /g
- &gt;根据{{3}}回答,此代码用,
(逗号和空格)替换所有新行。
因此,仅运行第一个命令后,输出将为
example entry &with/ special characters, next line (any characters), , next %*entry, more words
s/, , /\n/g
- &gt;在上面的输出中用新行替换, ,
将为您提供所需的结果。
example entry &with/ special characters, next line (any characters)
next %*entry, more words
答案 2 :(得分:2)
这可能适合你(GNU sed):
sed ':a;$!N;/.\n./s/\n/, /;ta;/^[^\n]/P;D' file
将下一行附加到当前行,如果有换行的任一侧有字符,则用逗号和空格替换换行,然后重复。最终会到达一个空行或文件结尾,如果它不为空,则只打印下一行。
另一个版本,但更柔和(允许空行中的空格)将是:
sed ':a;$!N;/^\s*$/M!s/\n/, /;ta;/\`\s*$/M!P;D' file
答案 3 :(得分:0)
sed -n '1h;1!H
$ {x
s/\([^[:cntrl:]]\)\n\([^[:cntrl:]]\)/\1, \2/g
s/\(\n\)\n\{1,\}/\1/g
p
}' YourFile
在缓冲区中加载文件后全部更改。可以在阅读文件的同时“在运行中”完成并基于空行。
在GNU sed上使用-e