递归grep遍历一个目录,提取标签之间的内容

recursively grep through a directory, and extract the contents between the tags

我们如何递归grep遍历一个目录,并在标签之间的行所在的位置提取下面指定的内容,即行号和文件位置?

... < start > contents to be extracted
this line as well 
and this line
and before the tag < / start >

如果必须 grep,请使用该命令:

grep -PzoHnr "(?s)< start >.*< / start >" .

解释:

  • -P:激活perl正则表达式
  • -z:将输入视为一组行,每行以零字节终止
  • -o: 只打印匹配项
  • -H: 在匹配前添加文件名
  • -n:在匹配
  • 前面加上行号
  • -r: 递归读取每个目录下的所有文件。
  • (?s):激活PCRE_DOTALL,这意味着.找到任何字符或换行符
  • < start >.*< / start >是正则表达式

或者,这里还有一个awk解决方案:

awk '/\<\ start\ \>/,/\<\ \/\ start\ \>/{print FILENAME ":" FNR ":" [=11=]}' $(find . -type f)

解释:

  • /\<\ start\ \>/,/\<\ \/\ start\ \>/:查找 < start >< / start >
  • 之间的所有内容
  • {print FILENAME ":" FNR ":" [=27=]}:打印文件名、行号和行
  • $(find . -type f)仅递归列出目录下的文件