将一行数据复制到下一行数据之前

问题描述 投票:0回答:2

有类似的数据

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 / /}'  

但这并没有给出所需的输出。

shell awk sed
2个回答
0
投票

使用

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}
..
..

0
投票

这是一个简单的 Awk 解决方案。

awk '/^[[:space:]]*start / { split($0, tag, "[{}]") }
    !/^[[:space:]]*start / && tag[2] { sub(/\{/, "{" tag[2] " ") }
    1'

如果正则表达式匹配,则将该行拆分为花括号上的数组

tag
。因此,
tag[2]
中的值是花卷之间的值。

否则,替换开头的花句以添加上一个匹配行中存储的

tag[2]
值。

1
是无条件打印所有行的简写。

演示:https://ideone.com/ZRJACS

© www.soinside.com 2019 - 2024. All rights reserved.