如何用ed工具合并文件中重复分类的文本块
用ed合并重复分类的方法
针对你给出的示例文件,要合并重复的type: food分类,可以用以下ed命令序列来实现:
分步执行(交互式编辑)
打开文件进入ed:
ed your_file.txt
然后依次输入以下命令:
- 定位到第一个
type: food行:/^type: food$/ - 跳转到该分类块的最后一行(空行的前一行),并标记这个位置为
a:/^$/-1 ka - 定位到第二个
type: food行(//表示重复上一次的搜索):// - 选中第二个分类下的所有条目(从当前行的下一行到空行前一行),并移动到标记
a的下一行:+1,/^$/-1m'a+1 - 删除多余的第二个
type: food标题行和后面的空行:// d /^$/ d - 保存修改:
w - 退出ed:
q
非交互式批量执行
如果想一次性完成,可以用here-doc方式执行:
ed -s your_file.txt <<'EOF' /^type: food$/ /^$/-1 ka // +1,/^$/-1m'a+1 // d /^$/ d w EOF
为什么你的原命令不生效?
你之前的命令/^type: food$/n.,/^$/-1m/^type: food$/n是把第一个分类块的内容移动到第一个分类标题行,完全搞反了操作对象。核心问题是没区分开两个重复的分类块,也没定位到正确的目标位置。要记住:ed的m命令是把选中的内容移动到指定行的后面,所以必须先选中第二个分类的条目,再指定第一个分类块末尾作为目标位置。
如果要处理多个重复的分类,你可以先通过g/^type:/p列出所有分类,用sort | uniq -D找出重复项,再对每个重复分类执行上述命令逻辑。
内容的提问来源于stack exchange,提问作者Dave




