【问题标题】:Remove newlines between two words删除两个单词之间的换行符
【发布时间】:2014-09-25 18:54:16
【问题描述】:

我有一个看起来像这样的文件:

name: charles
key1: how
are
you?
name: erika
key2: I'm
fine,
thanks
name: ...

如何删除“key\d+”和“name:”之间的新行?它应该是这样的:

name: charles
key1: how are you?
name: erika
key2: I'm fine, thanks
name: ...

我正在尝试使用 sed 或 awk 但没有任何成功。有什么办法可以清理这些线条吗?

有什么办法可以去掉“key\d+:”和“\w+:”之间的换行符吗?

【问题讨论】:

    标签: bash awk sed formatting sh


    【解决方案1】:

    这样的?

    kent$  awk '/^key.:/{p=1}/^name:/{p=0}
                {if(p)printf "%s",$0;else printf "%s%s\n", (NR==1?"":RS),$0}' file
    name: charles
    key1: howareyou?
    name: erika
    key2: I'mfine,thanks
    name: ...
    

    处理空格:

    awk '/^key.:/{p=1}/^name:/{p=0}
        {if(p)printf "%s%s",(/^key.:/?"":" "),$0;
        else printf "%s%s\n", (NR==1?"":RS),$0}' file
    

    输出:

    name: charles
    key1: how are you?
    name: erika
    key2: I'm fine, thanks
    name: ...
    

    【讨论】:

    • 绝对是最好的方法。 +1
    • @iiSeymour (nice 2 see u, Sudo :-) )谢谢指出。我没有注意到 OP 的输出。添加了检查以添加空格。
    【解决方案2】:

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

    sed ':a;$!N;/\n.*:/!s/\n/ /;ta;P;D' file
    

    在模式空间中保留两行,如果第二行不以关键字和: 开头,则从第一行删除换行符。当关键字和: 遇到时 print 然后删除第一行。

    【讨论】:

    • 这个更好,因为您没有对标签进行硬编码。
    【解决方案3】:

    替代 awk 解决方案。

    awk '
      {
        if      (NR == 1)                s = ""
        else if ($1 ~ /^[[:alnum:]]+:$/) s = RS
        else                             s = " "
        printf "%s%s", s, $0
      }
      END {print ""}
    '<<EOF
    name: charles
    key1: how
    are
    you?
    name: erika
    key2: I'm
    fine,
    thanks
    EOF
    name: charles
    key1: how are you?
    name: erika
    key2: I'm fine, thanks
    

    【讨论】:

    • 这几乎可以工作,但正在从另一个标签中删除换行符:pastebin.com/aexZgH8F 它已经删除了键标签的换行符,还删除了 name1 之前的换行符。
    【解决方案4】:

    以下工作,但性能显然不是最好的:

    cat file.txt | while read x;do echo "$x" | grep -q ':' &amp;&amp; echo; echo -ne "$x "; done | sed -n 's/ $//p'

    name: charles
    key1: how are you?
    name: erika
    key2: I'm fine, thanks
    name: ...
    

    【讨论】: