2014-10-10 28 views
2

我想substitue這可能包含正則表達式的元字符到另一個字一個字,例如,substitue的.Precilla123.Precill,我嘗試使用以下解決方案:如何使用Shell或Perl替換字符串,即使它包含正則表達式元字符?

sed 's/.Precilla123/.Precill/g' 

但會低於線改變

"Precilla123";"aaaa aaa";"bbb bbb" 

.Precill";"aaaa aaa";"bbb bbb" 

這種副作用是不是我想要的。所以我嘗試使用:

perl -pe 's/\Q.Precilla123\E/.Precill/g' 

上面的解決方案可以禁用解釋正則表達式元字符,它不會有副作用。
不幸的是,如果單詞包含$@,這個解決方案仍然不能工作,因爲Perl保留$@作爲可變前綴。

有人能幫助嗎?非常感謝。

請注意,我想要替換的單詞不是硬編碼的,它來自輸入文件,您可以將其視爲變量。

+0

'ABC $相同efg' =>'abcdefg' – ikegami 2014-10-10 03:08:36

+0

爲什麼不考慮轉義元字符或將它們放入字符類? – 2014-10-10 03:14:21

+0

您是否生成腳本來運行腳本?這聽起來像一個壞主意。你能否展示你如何生成「中間」文件?另外,看看'quotemeta',也許它有幫助。 – 2014-10-10 04:09:21

回答

3

不幸的是,如果字包含$@,該解決方案仍不能正常工作,因爲Perl保持$@爲變量前綴。

這是不正確的。

如果您要更換的值是一個Perl變量,然後quotemeta將工作對變量的內容就好了,包括文字$@

echo 'pre$foo to .$foobar' | perl -pe 'my $from = q{.$foo}; s/\Q$from\E/.to/g' 

輸出:

pre$foo to .tobar 

如果要替換的單詞位於外部文件中,則只需在編寫正則表達式進行替換之前在BEGIN塊中加載該數據即可。

+0

你的答案是正確的,非常專業。 Thnaks很多! – Jeff7566 2014-10-10 05:25:08

0
sed 's/\.Precilla123/.Precill/g' 

\逃避元字符。

要carrefull,mleta charactere不是爲搜索模式是主要的正則表達式[]{}()\.*+^$在替代性僅限於&\^$(+,在這兩種模式s後,依賴於你的第一個字符的分隔符)