Bash 使用sed合并行并添加逗号

Bash 使用sed合并行并添加逗号,bash,sed,Bash,Sed,我发现了几个相关的问题,但没有一个符合我的需要,而且因为我是一个真正的初学者,我想不出来 我有一个文本文件,其中的条目如下,由一个空行分隔: example entry &with/ special characters next line (any characters) next %*entry more words 我希望输出合并这些行,在它们之间加一个逗号,然后删除空行。即,示例应如下所示: example entry &with/ special character

我发现了几个相关的问题,但没有一个符合我的需要,而且因为我是一个真正的初学者,我想不出来

我有一个文本文件,其中的条目如下,由一个空行分隔:

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命令行上有其他解决方案。

根据Kent优雅的建议改进:

awk 'BEGIN{RS="";FS="\n";OFS=","}{$1=$1}7' file
example entry &with/ special characters,next line (any characters)
next %*entry,more words
它允许每个块有任意数量的线,而不是我以前的每个块有2条刚性线。谢谢你,肯特注意
7
是肯特的商标。。。任何非零表达式都会导致
awk
打印整个记录,他喜欢
7

您可以使用
awk

awk 'BEGIN{RS="";FS="\n";OFS=","}{print $1,$2}' file
这将记录分隔符设置为空行,字段分隔符设置为换行符,输出字段分隔符设置为逗号

输出:

awk 'BEGIN{RS="";FS="\n";OFS=","}{$1=$1}7' file
example entry &with/ special characters,next line (any characters)
next %*entry,more words

根据肯特优雅的建议改进:

awk 'BEGIN{RS="";FS="\n";OFS=","}{$1=$1}7' file
example entry &with/ special characters,next line (any characters)
next %*entry,more words
它允许每个块有任意数量的线,而不是我以前的每个块有2条刚性线。谢谢你,肯特注意
7
是肯特的商标。。。任何非零表达式都会导致
awk
打印整个记录,他喜欢
7

您可以使用
awk

awk 'BEGIN{RS="";FS="\n";OFS=","}{print $1,$2}' file
这将记录分隔符设置为空行,字段分隔符设置为换行符,输出字段分隔符设置为逗号

输出:

awk 'BEGIN{RS="";FS="\n";OFS=","}{$1=$1}7' file
example entry &with/ special characters,next line (any characters)
next %*entry,more words
在缓冲区中加载文件后更改所有。可以在读取文件时根据空行或非空行“动态”完成

在GNU上使用
-e

在缓冲区中加载文件后更改所有。可以在读取文件时根据空行或非空行“动态”完成


在GNU sed上使用
-e
Simple
sed
命令

sed ':a;N;$!ba;s/\n/, /g;s/, , /\n/g' file
  • :a;N、 美元!文学士;s/\n/,/g
    ->根据答案,此代码将所有新行替换为
    (逗号和空格)

  • 因此,在只运行第一个命令之后,输出将是

    example entry &with/ special characters, next line (any characters), , next %*entry, more words
    
  • s/,/\n/g
    ->在上述输出中用新行替换
    ,将获得所需的结果

    example entry &with/ special characters, next line (any characters)
    next %*entry, more words
    

Simple
sed
命令

sed ':a;N;$!ba;s/\n/, /g;s/, , /\n/g' file
  • :a;N、 美元!文学士;s/\n/,/g
    ->根据答案,此代码将所有新行替换为
    (逗号和空格)

  • 因此,在只运行第一个命令之后,输出将是

    example entry &with/ special characters, next line (any characters), , next %*entry, more words
    
  • s/,/\n/g
    ->在上述输出中用新行替换
    ,将获得所需的结果

    example entry &with/ special characters, next line (any characters)
    next %*entry, more words
    
这可能适合您(GNU-sed):

将下一行附加到当前行,如果换行符的任一侧有字符,则用逗号和空格替换换行符,然后重复。最终将到达一个空行或文件结尾,然后仅打印下一行(如果它不是空的)

另一个版本(允许空行中有空白)将是:

sed ':a;$!N;/^\s*$/M!s/\n/, /;ta;/\`\s*$/M!P;D' file
这可能适用于您(GNU-sed):

将下一行附加到当前行,如果换行符的任一侧有字符,则用逗号和空格替换换行符,然后重复。最终将到达一个空行或文件结尾,然后仅打印下一行(如果它不是空的)

另一个版本(允许空行中有空白)将是:

sed ':a;$!N;/^\s*$/M!s/\n/, /;ta;/\`\s*$/M!P;D' file

数据中的逗号应该在输出中以某种方式消除歧义吗?空行是一个条目分隔符,还是您总是有两行应该连接在一起?数据中的逗号应该在输出中以某种方式消除歧义吗?空行是一个条目分隔符吗,或者你总是有两行应该连接在一起吗?+1但是在
开始
块之后,我会做
…'{$1=$1}7'文件
用于“块”中有两行以上的情况。op需要逗号后的
空格
。您的代码应该是
awk'BEGIN{RS=“;FS=“\n”;OFS=“,”}{print$1,$2}'
+1但是在
开始
块之后,我会做
。”{$1=$1}7'文件
用于“块”中有两行以上的情况。op需要逗号后有
空格
。您的代码应该是
awk'BEGIN{RS=“;FS=“\n”;OFS=“,”}{print$1,$2}'
您必须在文本中或
在一行末尾处理
的情况。如果没有出现,您的代码是快速和简单的。您必须处理文本中有
或一行末尾有
的情况。如果没有发生,您的代码是快速和简单的