回答
已經給提供了近似答案的答案,這將涉及您的邊緣情況(缺少分號,分號後的附加分句)。
perl -plwe 's/\bgosub\s+([^;]+)/$1()/g'
它將所述gosub
關鍵字隨後空白是「不分號」並刪除它們後匹配任何字符序列。我還添加了/g
全局修飾符,因爲您可能希望在一行中完成所有替換。請注意使用字邊界\b
來防止部分匹配,例如不能代替legosub
。
如果字邊界不夠,例如它將取代1.gosub
因爲.
導致單詞字符之間的休息,你可以使用一個負回顧後改爲:
perl -plwe 's/(?<![^;\s])gosub\s+([^;]+)/$1()/g'
這就要求gosub
之前的任何字符不是除了分號或空格什麼。請注意,雙重否定也允許不匹配(行首)。
非常感謝。它適用於我遇到的所有條件 – user1912265
@ user1912265不客氣。您知道,如果您覺得已解決問題,您可以點擊旁邊的複選標記將答案標記爲「已接受」。 – TLP
my $str = 'stmt1; gosub xyz;';
$str =~ s/gosub (.*?);?/$1();/;
print $str;
謝謝你的工作。分號缺失的行數很少,在這種情況下我需要做些什麼改變? – user1912265
我加了;?正則表達式,它應該幫助 –
運行:
perl -i.bk -pe 's/gosub (.*?);/$1()/g' file.ext
感謝您的幫助。 分號缺失的行數很少,在這種情況下我必須做些什麼改變? – user1912265
那麼你需要的東西將被視爲你的函數名稱的結尾。如果它只是一個換行符,那麼你可以使用它:'perl -i.bk -pe's/gosub(。*?)\ n/$ 1()\ n/g'file.ext' – Ilion
這是可能的,是gosub之後的另一個聲明。對不起,最初沒有指定。所以這條線可以是stmt1; gosub foo; stmt2;或者它也可以只是stmt1; gosub foo – user1912265
- 1. Perl模式匹配
- 2. 與Perl匹配的模式
- 3. perl中的模式匹配
- 4. perl模式匹配數組
- 5. Perl模式匹配問題
- 6. Perl,模式匹配和元字符
- 7. Perl模式匹配和算術運算
- 8. Perl模式匹配和使用\ k
- 9. 匹配模式:正則表達式 - perl
- 10. 匹配來自開頭的模式 - Perl
- 11. 如何匹配的模式,並在Perl
- 12. 如何匹配Perl中模式匹配前後的行?
- 13. 用Perl模式打印匹配的字符串匹配
- 14. 用Perl匹配兩個重疊模式
- 15. 從perl文件中匹配模式
- 16. Perl模式匹配問題而驗證
- 17. Perl模式匹配變量問題
- 18. Perl到Python,HTML輸出匹配模式
- 19. 在Perl中重疊模式匹配
- 20. 使用數組時匹配Perl模式
- 21. perl正則表達式 - 錨和模式匹配
- 22. Perl正則表達式變量和匹配模式替換
- 23. 模式匹配正則表達式和在Perl
- 24. 在Perl模式匹配中,打印匹配的字符串直至匹配
- 25. 打印匹配和非匹配模式
- 26. jQuery的匹配文字和附加
- 27. 匹配模式和追加SED
- 28. 與模式算術匹配的Perl模式
- 29. 加入模式匹配
- 30. 匹配模式1和/或模式2
請參閱http://www.comp.leeds.ac.uk/Perl/sandtr.html – Himanshu
我嘗試使用「;」分隔線,作爲dilimiter,然後如果發現模式,我試圖更換它。 $ line =〜m/$ pattern_gosub(。*?)(\;)* $ /; $ line =〜s/$ pattern_gosub //; $ line =〜s/$ 1/$ 1 \(\)\; /; 但是這並沒有工作 – user1912265