如何提取文件中指定开头到空行的内容插入另一文件首行且去重
实现方案
完整可执行shell脚本
# 从源文件提取第一个以 `- name: ` 开头、到空白行结束的段落,移除末尾空白行后存入变量 extract_content=$(sed -n '/^- name: /,/^[[:space:]]*$/p' dire1/main.yml | sed '/^[[:space:]]*$/d') # 无匹配内容直接退出 [ -z "$extract_content" ] && exit 0 # 提取匹配内容的首行用于去重校验 extract_first_line=$(echo "$extract_content" | head -n 1) # 读取目标文件首行,文件不存在则返回空 readme_first_line=$(head -n 1 dire2/README.md 2>/dev/null || echo "") # 首行不一致才执行插入操作 if [ "$extract_first_line" != "$readme_first_line" ]; then # Linux环境插入到目标文件首行 sed -i "1i\\$extract_content" dire2/README.md # MacOS环境请替换上面的sed命令为下一行 # sed -i '' "1i\\$extract_content" dire2/README.md fi
逻辑说明
- 提取规则适配你给出的两个示例:
/^- name: /,/^[[:space:]]*$/p匹配从行首- name:开始,到纯空白行(含空格、制表符)结束的所有内容,后续sed命令移除末尾的空白行,输出和你要求的示例结果一致。 - 如果你需要匹配特定名称的段落,把第一个sed的匹配规则
/^- name: /改成对应的内容即可,比如匹配first step就改为/^- name: first step /,你之前的命令就是因为写死了未定义的string关键字才匹配不到内容。 - 去重逻辑直接比对匹配内容的首行和目标文件首行,完全一致就跳过插入,避免重复。
- 插入操作用sed的
1i语法直接在目标文件第一行前插入内容,不需要额外生成临时文件。
内容的提问来源于stack exchange,提问作者user16007126
相关产品推荐
相关产品推荐

