sed разбить на строки (продвинутый) - PullRequest
0 голосов
/ 16 ноября 2018

Я хочу использовать 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 голосов
/ 16 ноября 2018

sed можно использовать. Существует замечательная Sed - Введение и Учебное пособие Брюса Барнетта онлайн-страница, которую я всегда открываю, когда пишу сценарий 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
0 голосов
/ 16 ноября 2018

В одиночном 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
0 голосов
/ 16 ноября 2018

С tr и awk:

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
0 голосов
/ 16 ноября 2018

В 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]".

0 голосов
/ 16 ноября 2018

Вы можете попробовать сделать что-то вроде этого:

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

Будет возвращено:

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