如何转换文本以使每个输出行都以块的标题开头?

ahm*_*med 1 shell-script

我需要制作一个脚本来转换以下内容:

Name = x:y
Z =  a:b.c
Z1 = a1:b1.c1
End
Name=x1:y1
Z2 = a2:b2.c2
Z3 = a3:b3.c3
Z4 = a4:b4.c4
End
Name = l:k
s = w:e.v
End
Run Code Online (Sandbox Code Playgroud)

进入:

x:y Z    a:b.c
x:y Z1   a1:b1.c1
x1:y1   Z2   a2:b2.c2
x1:y1   Z3   a3:b3.c3
x1:y1   Z4   a4:b4.c4
l:k s    w:e.v
Run Code Online (Sandbox Code Playgroud)

gle*_*man 5

使用=可选的周围空白作为分隔符:

awk -F '[[:blank:]]*=[[:blank:]]*' '
    $1 == "Name" {name = $2; next}
    $1 != "End"  {print name, $1, $2}
' filename
Run Code Online (Sandbox Code Playgroud)

例子

在查看这些awk解决方案时,可能会有点困惑正在发生的事情。如果您插入一些放置良好的打印语句,您可以开始以视觉方式看到正在发生的事情:

$ awk -F '[[:blank:]]*=[[:blank:]]*' '
      $1 == "Name" { name = $2; print "--NAME: "$2; next }; 
      $1 != "End" { print " --END: "name,$1,$2 }
' sample.txt
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

--NAME: x:y
 --END: x:y Z a:b.c
 --END: x:y Z1 a1:b1.c1
--NAME: x1:y1
 --END: x1:y1 Z2 a2:b2.c2
 --END: x1:y1 Z3 a3:b3.c3
 --END: x1:y1 Z4 a4:b4.c4
--NAME: l:k
 --END: l:k s w:e.v
Run Code Online (Sandbox Code Playgroud)