2014-11-21 33 views
0

我一直在尋找一個單線perl命令的時間來放置一個腳本,它將執行從類似於sed的文件中讀取多模式替換。是否有一行perl等價於:sed -n -f multipatternfile textfile?

試圖做一個Perl的一個班輪多模板搜索使用多重圖像文件上的文本文件替換:

文本文件:

apples bananas oranges 
blueberries walnuts granola 

multipatternfile:

s/blueberries/chocolate/p 
s/bananas/raisins/p 

使用SED我能做到這一點單行:

$ sed -n -f multipatternfile textfile 
apples raisins oranges 
chocolate walnuts granola 

使用perl我想這一個班輪:

$ perl -pi -F multipatternfile textfile 
syntax error at multipatternfile line 2, near "s/bananas/raisins/p" 
Execution of multipatternfile aborted due to compilation errors. 

但Perl版本在第二圖案扼流圈不管我在那裏的第二圖案。

格式化文件格式的方式有什麼問題嗎?

在你問之前,我不能使用sed,因爲sed沒有非貪婪的正則表達式。

+0

你試過'sed的 - P'?某些版本的sed支持類似Perl的正則表達式。 – Lynn 2014-11-21 21:27:19

+0

出於興趣 - 你爲什麼需要它是一個班輪?如果你有一個模式文件,你是否可以沒有Perl腳本? – Sobrique 2014-11-21 21:33:42

+0

@nooodl是的。你碰到這個着名的sed錯誤: sed -n -r -f /tmp/testpatterns/tmp/testfile sed:file/tmp/testpatterns第2行:'s'命令的RHS上無效的引用\ 1 – androidin 2014-11-21 21:56:57

回答

-1

好吧,我想通了這一點:

multipatternfile:

s/blueberries/chocolate/p; 
s/bananas/raisins/p; 

你需要在圖案的兩端有分號的Perl:

$ perl -p multipatternfile textfile 
apples raisins oranges 
chocolate walnuts granola 
+0

我問的部分原因是因爲_is_是一個Perl腳本。或者非常接近。但只要你有滿足你需求的東西,就夠公平了。 – Sobrique 2014-11-21 22:46:51

+1

這是不正確的。如果使用'-a'開關,'-F'指定自動分割模式。當你不使用'-a'時,'-F'開關未被使用。你也可以只使用'-p'。或者如果你想要看起來,只需添加'while(<>){s /..../;打印; }'並且你根本不需要任何開關,並且你會擁有那些可怕的「perl腳本」之一。 – TLP 2014-11-21 22:59:28

+1

另外,'/ p'修飾符不太可能做你的想法。這是來自'perldoc perlop'的描述:'當匹配時保留匹配字符串的副本,以便定義$ {^ PREMATCH},$ {^ MATCH},$ {^ POSTMATCH}。' – TLP 2014-11-21 23:02:52

相關問題