Bash中匹配多段缩进内容并输出所有匹配结果的方案
解决Bash中多行正则匹配块的问题
方案1:用awk(推荐,易读且支持多文件)
awk处理这类多行块逻辑很直观,直接按规则输出匹配的段落:
awk ' /^keyword/ { print; in_block=1; next } in_block && /^[ \t]/ { print; next } { in_block=0 } ' *.md
逻辑说明:
- 碰到以
keyword开头的行,打印该行并标记进入匹配块 - 处于匹配块内时,只要是空格/制表符开头的缩进行就打印
- 碰到既不是
keyword开头也不是缩进的行,退出匹配块,不输出
直接替换*.md为你要处理的文件列表(比如file1.md file2.md)即可,多文件的匹配结果会按文件顺序输出。
方案2:用GNU sed
如果习惯用sed,GNU sed(Linux默认版本)可以通过标签循环实现:
sed -n '/^keyword/{:a;p;n;/^[ \t]/ba}' *.md
逻辑说明:
-n表示只打印匹配内容- 找到
keyword开头的行后,进入循环:打印当前行,读取下一行,若下一行是缩进开头就继续循环,直到遇到非缩进行停止
方案3:用GNU grep(需注意换行处理)
要是一定要用grep,得借助GNU grep的特殊选项处理多行:
grep -zPo '(^keyword.*?(?=\n[^ \t]|\Z))' *.md | tr '\0' '\n'
逻辑说明:
-z把整个文件当作单行处理(用null字符分隔内容)-P启用Perl正则语法,支持正向预查- 正则匹配
keyword开头的内容,直到碰到换行后非缩进的行或文件结尾 - 最后用
tr把grep输出的null字符换回正常换行
内容的提问来源于stack exchange,提问作者Pipaul
相关产品推荐
相关产品推荐

