2016-03-20 38 views
0

我有這個文件test(大括號之間的線可以改變幾行的量):perl的預期吻合後oneliner替代任何

\Email{test} 
\Adresse{tes \\ 
test \\ 
test} 
\Gruss{test} 

我想要什麼:

\Email{test} 
\Adresse{} 
\Gruss{test} 

suggested solutionperl -i -pe 'BEGIN{undef $/;} s/\\Adresse.*}/\\Adresse{}/smg' test

將文字轉換爲

\Email{} 
\Adresse{} 
\Gruss{} 

並刪除\Gruss{test}。我可以如何防止這種行爲?

編輯澄清:我想保留\Adresse {}之前和之後的整個文本。另外,我在我的「真實文件」中提供了一個解決方案,所以我改進了對問題的描述。

+0

所以,你想刪除多,並保持了'{}'之間的單行文本? – jm666

+0

我想刪除那些'{}' – toogley

+1

然後編輯你的問題 - 因爲你說想要:'\ Gruss {test}'... :( – jm666

回答

1

可以試試

perl -0 -pe 's/(\\Adresse\{).*?}/$1}/sg' 

\Adresse{tes 
test 
test} 
\Gruss{test} 

從產生

\Adresse{} 
\Gruss{test} 
\Email{test} 
\Adresse{tes \\ 
test \\ 
test} 
\Gruss{test} 

產生

\Email{test} 
\Adresse{} 
\Gruss{test} 
+0

你能另外請解釋爲什麼我的命令不起作用,你的呢?是perl中的非貪婪行爲標準嗎? – toogley

+1

@toogley,每個正則表達式默認爲貪婪 - 例如嘗試匹配大部分可能的字符。不僅在Perl中。 '。*?'表示 - 非貪婪 - 與幾個可能的字符匹配 - 例如在第一次找到'}'時停下來。 – jm666

1

您可以嘗試使用「非貪婪」匹配結合/s正則表達式修飾符來匹配換行符與.。此外,您還可以用-0選項替換BEGIN{undef $/;}

perl -0 -pe 's/{.*?}/{}/sg' test 
+0

The gree dy vs non-greedy方面是正確的,但爲什麼要將匹配移除到'\\ Adresse'? OP似乎希望其他起始花括號的內容保持原位,只需清空'\\ Adresse {}'。 。 。 –