有类似的数据
start {data}
target {ABC}
start {data2}
target {DEF}
target {GHI}
start {data3}
target {JKL}
....
我希望将关键字“start”之后的 {data} 或 {data2} 移动到下一行,即
start {data}
target {data ABC}
start {data2}
target {data2 DEF}
target {data2 GHI}
start {data3}
target {data3 JKL}
....
我试过了
sed '/^[[:space:]]*start*/{ N;s/[[:space:]]*target / /}'
但这并没有给出所需的输出。
使用
sed
$ sed -E '/start/{p;s/^[0-9]+\.start[^{]*\{([^}]*).*/\1 /;h;d};/target/{G;s/(\{)([^}]*})\n(.*)/\1\3\2/}' input_file
1.start {data}
2.target {data ABC}
3.start {data2}
4.target {data2 DEF}
5.target {data2 GHI}
6.start {data3}
7.target {data3 JKL}
..
..
这是一个简单的 Awk 解决方案。
awk '/^[[:space:]]*start / { split($0, tag, "[{}]") }
!/^[[:space:]]*start / && tag[2] { sub(/\{/, "{" tag[2] " ") }
1'
如果正则表达式匹配,则将该行拆分为花括号上的数组
tag
。因此,tag[2]
中的值是花卷之间的值。
否则,替换开头的花句以添加上一个匹配行中存储的
tag[2]
值。
1
是无条件打印所有行的简写。