递归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)
仅递归列出目录下的文件
我们如何递归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)
仅递归列出目录下的文件