使用sed合并行并添加逗号

时间:2014-05-08 08:22:26

标签: bash sed

我发现了几个相关的问题,但它们都不符合我的需要,因为我是一个真正的初学者,我无法弄清楚。

我有一个包含这样的条目的文本文件,用空行分隔:

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命令行上的任何其他解决方案感到高兴。

4 个答案:

答案 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