我經常使用正則表達式來轉換文本。如何將命令行中的多行模式與perl風格的正則表達式匹配?
要在命令行變換,巨大的文本文件,perl的讓我做到這一點:
perl -pe <in.txt> out.txt
但是,這本質上是一行一行地的基礎。偶爾,我想匹配多行的東西。
如何在命令行中執行此操作?
我經常使用正則表達式來轉換文本。如何將命令行中的多行模式與perl風格的正則表達式匹配?
要在命令行變換,巨大的文本文件,perl的讓我做到這一點:
perl -pe <in.txt> out.txt
但是,這本質上是一行一行地的基礎。偶爾,我想匹配多行的東西。
如何在命令行中執行此操作?
要發出聲音文件而不是由線加工做行,使用-0777
開關:
perl -0777 -pe 's/.../.../g' in.txt > out.txt
特殊值
-00
將導致Perl來段落模式下的slurp文件。任何值-0400
或更高都會導致Perl整個文件夾癱瘓,但按照慣例,值-0777
是通常用於此目的的文件。
顯然,對於大文件,這可能無法正常工作,在這種情況下,您需要編寫某種類型的緩衝區來執行此替換。如果沒有關於您的意圖的真實信息,我們不能提供更好的建議。
自1997年以來,我一直在編程Perl。這是我見過的最瘋狂的命令行參數。謝謝! – kevinarpe
跨線邊界
所以,你要跨線邊界到grep ...
Grepping你很可能已經安裝了pcregrep
。您可能知道,PCRE代表Perl-Compatible Regular Expressions
,該庫絕對是Perl風格的,儘管與Perl不同。
要跨多行匹配,你必須打開多行模式-M
,這是不一樣的(?m)
運行pcregrep -M "(?s)^b.*\d+" text.txt
在這個文本文件:
a
b
c11
輸出將爲
b
c11
而grep將返回空。從DOC
摘錄:
-M,--multiline允許模式來匹配多於一個的線。當給出這個選項時,模式可能會有用地包含文字換行符字符和內部出現的^和$字符。對於成功匹配的輸出 可以由多於一行組成,最後的 是其中比賽結束的那一行。如果匹配的字符串 以換行符序列結束,則輸出在該行的結尾處結束。
設置此選項時,PCRE庫在「多路」 模式下調用。可以匹配的行數有一個限制, 通過pcregrep緩衝輸入文件的方式施加,因爲它會掃描 它。但是,pcregrep確保至少8K個字符或文檔的其餘 (以較短者爲準)可用於 正向匹配,並且與前面的8K字符相同(或以前的字符全部爲 ,如果小於8K)保證爲 可用於lookbehind斷言。當 輸入逐行讀取時,此選項不起作用(請參閱 - 行緩衝。)
這聽起來像我想要的,除了我也還需要替代部分。 – JnBrymn
我相信Perl可以做你需要的。您可以要求它使用除換行符之外的記錄分隔符,也可以將文件拆分爲空行或使用固定的記錄大小。或者,如果您的文件的大小合理,則可以將其全部讀入內存並從中讀取。我不知道什麼是最好的方法,除非你更多地解釋你的應用程序 – Borodin
請參閱http://docstore.mik.ua/orelly/unix/sedawk/ch06_01.htm – Fabricator
具體來說,'perl -0777 -pe .. 。「並非天生就是逐行的。 :) – Amadan