2015-01-13 42 views
1

我有一個文本,沒有行的話,我想刪除不匹配模式中的所有字符:刪除所有字符/不匹配模式

模式是從字直到找到}}。例如,如果我有這樣的條目:

KHJLMNNamespaceparameter:{{"Hello i am here"}}NamespaceHSKFSAFSLLLJparameter:{{H}}... 

我想刪除一切,在文件中留下這樣的:parameter:{{"Hello i am here"}} parameter:{{H}}

所有我發現那裏是刪除一行不包含模式,但我不能找到任何與沒有/ n(行尾)巨大的文件相關的任何東西。使用sed,awk還是Vi可以做到這一點?

謝謝!

回答

4
$ awk 'BEGIN{RS=ORS="}}"} sub(/.*parameter/,"parameter")' file 
parameter:{{"Hello i am here"}}parameter:{{H}} 

注意,這是呆子特有由於多焦RS。

+1

這個答案適合我。 – iOSAddicted

1

如果perl是一個選項,你可以這樣做:

perl -ne "my @wo = ($_ =~ /parameter:\{\{.*?\}\}/g); print join(' ',@wo);" your_text_file 

在Perl中,改性劑*?是一個非貪婪量詞,以使其停止在第一次遇到}}

我覺得一個Perl的專家可以在一個指令做到這一點,沒有一個臨時數組...

編輯:該命令只輸出在標準輸出想要的文本。要更改文件本身,調用的perl時使用開關-i

perl -i.bak -ne "my @wo = ($_ =~ /parameter:\{\{.*?\}\}/g); print join(' ',@wo);" your_text_file 

備份文件與擴展名.bak附加在末尾的,結果被寫在一個文件具有相同的名稱爲創建的輸入文件名。請注意,您不能單獨使用swtich -i獲得備份文件,但有些平臺不允許這樣做。有關更多信息,請參見doc perlrun

+0

我剛剛測試過,但它不工作......謝謝反正! – iOSAddicted

+0

對我來說,輸出和你想要的一樣。您能否更準確地瞭解錯誤/失敗?你使用的是哪個版本的Perl?礦是5.20.1 – Bentoy13

+0

它只是不打印任何輸出。 「my @wo =($ _ =〜/parameter:\{\{.*?\}\}/g); print join('',@禾);」 output.txt,但它不會打印任何東西... 我的Perl版本是5.16.0 – iOSAddicted

1

您可以使用此grep-P(PCRE)正則表達式:

grep -oP '.*?\Kparameter:\{\{.*?\}\}' file 
parameter:{{"Hello i am here"}} 
parameter:{{H}}