![](/img/trans.png)
[英]How can I search for a file that contains a pattern and then search within all those files with another pattern?
[英]How can I search for a multiline pattern in a file?
我需要找到包含特定字符串模式的所有文件。 想到的第一個解決方案是使用帶有xargs grep的 find管道:
find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN'
但是如果我需要找到跨越多行的模式,我就會被卡住,因為vanilla grep無法找到多行模式。
所以我發現pcregrep代表Perl兼容的正則表達式GREP 。
例如,您需要查找“ _name ”變量后面緊跟“ _description ”變量的文件:
find . -iname '*.py' | xargs pcregrep -M '_name.*\n.*_description'
提示:您需要在模式中包含換行符。 根據您的平台,它可能是'\\ n',\\ r','\\ r \\ n',...
你為什么不去找awk :
awk '/Start pattern/,/End pattern/' filename
grep -P
也使用libpcre,但更廣泛的安裝。 要查找html文檔的完整title
部分,即使它跨越多行,您也可以使用:
grep -P '(?s)<title>.*</title>' example.html
由於PCRE項目實現了perl標准,因此請使用perl文檔作為參考:
這是一個更有用的例子:
pcregrep -Mi "<title>(.*\n){0,5}</title>" afile.html
它在html文件中搜索title標簽,即使它最多可以跨越5行。
以下是無限行的示例:
pcregrep -Mi "(?s)<title>.*</title>" example.html
這個答案可能有用:
要遞歸查找,可以使用標志-R(遞歸)和--include(GLOB模式)。 看到:
perl -ne 'print if (/begin pattern/../end pattern/)' filename
@Marcin:awk示例非貪婪:
awk '{if ($0 ~ /Start pattern/) {triggered=1;}if (triggered) {print; if ($0 ~ /End pattern/) { exit;}}}' filename
使用ex
/ vi
編輯器和globstar選項 (類似於awk
和sed
語法):
ex +"/string1/,/string3/p" -R -scq! file.txt
其中aaa
是你的起點, bbb
是你的結尾文本。
要遞歸搜索,請嘗試:
ex +"/aaa/,/bbb/p" -scq! **/*.py
注意:要啟用**
語法,請運行shopt -s globstar
(Bash 4或zsh)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.