如何用sed在匹配的3行文本块前插入指定内容?
解决Sed匹配3行块并前置插入内容的问题
核心思路
Sed默认逐行处理,要匹配连续多行的内容块,需用N命令将后续行载入模式空间,拼接成多行内容后再进行匹配判断。针对你的需求,我们需要把目标3行载入后完成匹配,再在匹配块的第一行之前插入指定内容。
具体命令
sed '/\[ placeholder \]/ {N;N; /Categ #.*\nItemName 2/ {i\new_line1\nnew_line2\nnew_line3\n} }' your_file.txt
命令拆解
/\[ placeholder \]/:定位到包含[ placeholder ]的行(方括号是Sed的特殊字符,必须加反斜杠转义){N;N;}:将当前行之后的2行依次载入模式空间,此时模式空间内存储了连续3行的内容/Categ #.*\nItemName 2/:检查模式空间内的3行是否符合要求——包含Categ #开头的行(.*匹配任意编号n),且下一行是ItemName 2(\n代表换行分隔){i\new_line1\nnew_line2\nnew_line3\n}:匹配成功后执行i命令插入内容,每个\n用于分隔插入的行,最后一个\n确保插入内容与原块之间的换行格式正确
测试示例
假设原文件内容:
some random text [ placeholder ] Categ #7 ItemName 2 more content here
执行命令后的输出:
some random text new_line1 new_line2 new_line3 [ placeholder ] Categ #7 ItemName 2 more content here
注意事项
- 若要直接修改原文件,给命令加上
-i参数(适用于GNU Sed):sed -i '/\[ placeholder \]/ {N;N; /Categ #.*\nItemName 2/ {i\new_line1\nnew_line2\nnew_line3\n} }' your_file.txt - 不同版本Sed(如BSD Sed)的
i命令语法可能有差异,若出现问题,可将插入内容拆分为多个i命令,比如:sed '/\[ placeholder \]/ {N;N; /Categ #.*\nItemName 2/ {i\new_line1 i\new_line2 i\new_line3 } }' your_file.txt
内容的提问来源于stack exchange,提问作者AniaDM
相关产品推荐
相关产品推荐

