如何获取两个字符串间的全部匹配内容?sed命令多实例优化
解决sed匹配多实例结束标记的问题
你当前使用的cat file.txt | sed "/string1/,/string2/p"命令存在两个问题:一是默认sed会输出所有行,加上p会导致匹配行重复打印;二是sed的范围匹配/string1/,/string2/仅会匹配第一个string1到第一个string2的区间,后续的string2不会被纳入匹配范围。
以你的示例文件为例,string1=aaa,string2=rrr,当前命令仅输出到第一个rrr,无法包含第二个rrr。
方案1:单条sed命令匹配到最后一个结束标记
使用sed的循环和保持空间逻辑,确保从第一个string1开始,打印所有内容直到最后一个string2:
sed -n '/string1/{:a;p;n;/string2/{p;ba};${x;/./p}}' file.txt
命令说明:
-n:关闭sed默认行输出,只打印指定内容/string1/{...}:匹配到string1时执行内部逻辑:a:定义循环标记ap:打印当前行n:读取下一行到模式空间/string2/{p;ba}:若当前行是string2,打印该行并跳回循环标记a继续处理后续行${x;/./p}:处理到文件末尾时,检查并打印最后一个string2相关内容
方案2:先定位最后一个结束标记的行号(更直观)
先用grep获取最后一个string2的行号,再用sed打印目标区间:
end_line=$(grep -n "string2" file.txt | tail -1 | cut -d: -f1) sed -n "/string1/,${end_line}p" file.txt
命令说明:
grep -n "string2" file.txt:输出所有含string2的行并附带行号tail -1:提取最后一行(即最后一个string2所在行)cut -d: -f1:拆分出行号部分sed -n "/string1/,${end_line}p":打印从string1所在行到目标行号的所有内容
方案3:用awk实现多区间匹配(可选)
如果需要匹配所有string1到对应string2的独立区间(比如文件中有多组起始-结束标记),可以用awk:
awk '/string1/{flag=1} flag{print} /string2/{flag=0}' file.txt
该命令会在遇到string1时开启打印标记,遇到string2时关闭标记,自动处理多组区间内容。
内容的提问来源于stack exchange,提问作者nahaap
相关产品推荐
相关产品推荐

