如何用sed将后续行的方括号内容批量追加到对应item行?
解决方案
可以通过利用sed的**保持空间(Hold Space)**来实现这个需求,核心思路是先收集所有带括号的detail条目信息,再遍历item行进行匹配替换。
适用GNU sed的命令(带扩展正则)
sed -iE ' # 收集带[]的detail条目,格式化为"name:内容"存入保持空间 /detail ([^[]*)\[(.*)\];/ { h s//\1:\2/ H g s/\n/ / h d } # 处理item行,从保持空间取出对应信息替换 /item ([^,]*),/ { G s/item ([^,]*),(.*)\n\1:(.*)/item \1[\3],/ s/\n.*$// } ' File.txt
命令逻辑说明
- 收集detail信息:
- 匹配带
[]的detail行,提取名称([^[]*匹配到[之前的内容)和括号内的文本 - 将提取的内容转换为
name:内容的格式,追加到保持空间,累积所有这类条目
- 匹配带
- 处理item行:
- 将保持空间的内容追加到当前item行后
- 查找当前item名称对应的
name:内容映射,替换为item name[内容],的格式 - 最后移除追加的保持空间内容,保留修改后的item行
为什么你的原命令无效
sed的反向引用仅能在同一个正则匹配-替换命令中生效,无法跨行引用之前匹配到的内容。所以必须先把需要的信息存储到保持空间,再在处理item行时调用这些信息。
内容的提问来源于stack exchange,提问作者Enialis
相关产品推荐
相关产品推荐

