我正在尝试拉出一个bash单行程,用于在两个模式之间打印行。不过,我需要它不贪婪。我有一个文件'test.txt',其中包含以下内容:
############ Apple ############
# 1
# 2
# 3
# 4
#################################
############ Orange ############
# 1
# 2
# 3
# 4
#################################
############ Grape ############
# 1
# 2
# 3
# 4
#################################
我想要打印的是“橙色”部分。而且只有那一节。也就是说,我想要打印以下内容:
############ Orange ############
# 1
# 2
# 3
# 4
#################################
我也不想匹配特定数量的行,因为行数会波动。我尝试了很多不同的东西。我试过sed,awk,grep(用-P和*。?regex)。似乎没有什么比这更合适了。 Sed和awk很贪心,所以我无法匹配该部分的结尾。 Grep(据我所知)不支持多行范围匹配。使用内置插件是否有解决方案?我知道有pcregrep,但我宁愿使用内置插件或者用普通发行版“运送”的东西。我想要“开箱即用”而优雅。有可能吗?
答案 0 :(得分:4)
使用sed的地址范围:
sed -n '/^#\+[ ]*Orange[ ]*#\+/,/^#\+$/ p' infile
它产生:
############ Orange ############
# 1
# 2
# 3
# 4
#################################
答案 1 :(得分:3)
perl -ne 'BEGIN{$/=/^#+$/} print $_ if /Orange/' file