簡體   English   中英

如何在文件中搜索多行模式?

[英]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

以下是使用GNU grep的示例:

grep -Pzo '_name.*\n.*_description'

-z / --null-data將輸入和輸出數據視為行序列。

另見這里

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 

銀色搜索者

ag 'abc.*(\n|.)*efg'

銀色搜索者的速度優化可能會在這里發揮作用。

你可以在這里使用grep alternative sift (免責聲明:我是作者)。

它支持多行匹配並將搜索限制為開箱即用的特定文件類型:

sift -m --files '*.py' 'YOUR_PATTERN'

(搜索指定多行正則表達式模式的所有* .py文件)

它適用於所有主要操作系統。 查看示例頁面 ,了解如何使用它從XML文件中提取多行值。

這個答案可能有用:

需要用於多行搜索的正則表達式(grep)

要遞歸查找,可以使用標志-R(遞歸)和--include(GLOB模式)。 看到:

使用grep --exclude / - include語法不要瀏覽某些文件

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選項 (類似於awksed語法):

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM