2014-06-12 65 views
3

我經常使用正則表達式來轉換文本。如何將命令行中的多行模式與perl風格的正則表達式匹配?

要在命令行變換,巨大的文本文件,perl的讓我做到這一點:

perl -pe <in.txt> out.txt 

但是,這本質上是一行一行地的基礎。偶爾,我想匹配多行的東西。

如何在命令行中執行此操作?

+1

我相信Perl可以做你需要的。您可以要求它使用除換行符之外的記錄分隔符,也可以將文件拆分爲空行或使用固定的記錄大小。或者,如果您的文件的大小合理,則可以將其全部讀入內存並從中讀取。我不知道什麼是最好的方法,除非你更多地解釋你的應用程序 – Borodin

+0

請參閱http://docstore.mik.ua/orelly/unix/sedawk/ch06_01.htm – Fabricator

+1

具體來說,'perl -0777 -pe .. 。「並非天生就是逐行的。 :) – Amadan

回答

4

要發出聲音文件而不是由線加工做行,使用-0777開關:

perl -0777 -pe 's/.../.../g' in.txt > out.txt 

perlrun #Command Switches記載:

特殊值-00將導致Perl來段落模式下的slurp文件。任何值-0400或更高都會導致Perl整個文件夾癱瘓,但按照慣例,值-0777是通常用於此目的的文件。

顯然,對於大文件,這可能無法正常工作,在這種情況下,您需要編寫某種類型的緩衝區來執行此替換。如果沒有關於您的意圖的真實信息,我們不能提供更好的建議。

+2

自1997年以來,我一直在編程Perl。這是我見過的最瘋狂的命令行參數。謝謝! – kevinarpe

1

跨線邊界

所以,你要跨線邊界到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斷言。當 輸入逐行讀取時,此選項不起作用(請參閱 - 行緩衝。)

+0

這聽起來像我想要的,除了我也還需要替代部分。 – JnBrymn

相關問題