sed分成几行(高级)

时间:2018-11-16 08:30:12

标签: bash awk sed command-line grep

我正在寻找使用sed(或将其与另一个grep命令结合使用)来转换以下字符串

John: Hi!,How are you,?,Dylan: Hey,OK

进入

John: Hi!
John: How are you
John: ?
Dylan: Hey
Dylan: OK

如果不可能的话,我愿意为此做出让步

John: Hi!,How are you,?
Dylan: Hey,OK

非常感谢

5 个答案:

答案 0 :(得分:3)

awk:

$ awk 'BEGIN{RS=","}{if($1~/:$/)p=$1;print ($1==p?"":p " ") $0}' file
John: Hi!
John: How are you
John: ?
Dylan: Hey
Dylan: OK

最后会有一个多余的空行。对于某些awk(至少是GNU awk,mawk和Busybox awk),可以使用RS="[,\n]"

答案 1 :(得分:3)

可以使用

sed。 有一个很棒的Sed - An Introduction and Tutorial by Bruce Barnett在线页面,我在编写sed脚本时总是将其打开。

尝试一下:

printf 'John: Hi!,How are you,?,Dylan: Hey,OK\n' | sed -n '
:1
/./ {
  /^[^:,][^:,]*: / {
    h
    s/^\([^:,][^,:]*: \).*$/\1/
    x
    s/,/\n/
    P
    D
  }
  x
  /./ {
    x
    H
    x
    s/\n//g
    x
    s/.//g
    x
    b 1
  }
}'

输出为:

John: Hi!
John: How are you
John: ?
Dylan: Hey
Dylan: OK

答案 2 :(得分:2)

使用trawk

tr ',' '\n' <file | awk '/:/{name=$1; print; next}; {print name,$0}'

或更短:

tr ',' '\n' <file | awk '/:/?name=$1:$0=name " " $0'

输出:

John: Hi!
John: How are you
John: ?
Dylan: Hey
Dylan: OK

答案 3 :(得分:1)

在单个awk中,考虑到您的Input_file与所示示例相同,那么下面的内容可能会对您有所帮助。

awk -F',' '
{
  for(i=1;i<=NF;i++){
    if($i~/:/){
      if($i ~ /: /){
        print $i
        split($i,array," ")
        val=array[1]
      }
      else{
        val=$i
      }
    }
    else{
      print val,$i
    }
  }
}'  Input_file

答案 4 :(得分:0)

您可以尝试执行以下操作:

echo 'John: Hi!,How are you,?,Dylan: Hey,OK' | sed -E "s|(\w+:)|\n\1|g"

它将返回:

John: Hi!,How are you,?,
Dylan: Hey,OK