如何使用sed将start行的关联数据追加到后续target行中?
问题解决:将start后的内容追加到后续target行
原始输入
start {data} target {ABC} start {data2} target {DEF} target {GHI} start {data3} target {JKL} ....
期望输出
start {data} target {data ABC} start {data2} target {data2 DEF} target {data2 GHI} start {data3} target {data3 JKL} ....
问题分析
你之前的sed命令仅能处理紧跟start的首个target行,且未正确提取并复用start后的内容,无法应对多个连续target的场景,因此达不到预期效果。
解决方案
推荐用awk实现,逻辑更直观且能处理所有情况:
awk '/^[[:space:]]*start/{curr=$2; gsub(/[{}]/,"",curr); print; next} /^[[:space:]]*target/{gsub(/\{/,"{"curr" ",$0); print}' input.txt
命令解释
- 匹配到
start行时:- 提取第二个字段(即
{data}这类内容) - 去掉字段里的
{},把纯内容存到变量curr - 直接打印当前start行,跳过后续处理
- 提取第二个字段(即
- 匹配到
target行时:- 把行里的
{替换成{curr(curr是之前保存的start内容) - 打印修改后的target行
- 把行里的
- 其他行(如果存在)会默认输出,无需额外处理
如果一定要用sed,可以用以下命令(逻辑相对复杂):
sed -n '/^[[:space:]]*start/{s/^[[:space:]]*start {\(.*\)}/&\n/p;h;s/^[[:space:]]*start {\(.*\)}/\1/;x;:a;n;/^[[:space:]]*target/{s/^[[:space:]]*target {\(.*\)}/target {\2 \1}/;p;ba};x;p}' input.txt
内容的提问来源于stack exchange,提问作者Keshav Mathur
相关产品推荐
相关产品推荐

