sed内部有模式空间和保留空间之分。
通常情况下,sed从文件中逐行读入内容到模式空间内进行处理,一次只处理一行,所有你没法直接匹配多行内容。
涉及用sed处理多行文本的问题,首先考虑直接匹配地址范围来处理,不行的话其次还可以考虑利用sed的保留空间。
1)此问题直接用sed匹配地址范围即可。
str="#方法一\n你好\n我好\n他好\n#方法二\nNihao\nWohao"
echo -e "$str" | sed '/^#方法一/,/^#方法二/d'
这样就可以了,"#方法一"到"#方法二"以及之间的所有行就都被删除了。
2)更复杂点的情况,通常我们还可以利用sed的保留空间来完成。
在处理这个问题上繁杂了点,但非常适合新手学习理解用。
echo -e "$str" | sed -n '/^#方法一/{:a;h;/^#方法二/{x;d};/^#方法二/!{n;ba}};p'
通过h命令可以将模式空间里的内容附加到保留空间,利用循环反复操作(:a 设置标签a;ba 跳转到标签a;n命令读入下一行到模式空间),在保留空间内拼接成多行文本(通过\n分隔),然后通过x命令交换保留空间与模式空间的内容(或者通过g命令拷贝保留空间内容覆盖到模式空间),这样才在模式空间内得到多行文本,最后用d命令一下子删除。