我正在寻找使用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
非常感谢
答案 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)
使用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
答案 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