使用\1
,\2
等在替換表達式中是錯誤的。 \1
是一個正則表達式模式,意思是「匹配匹配的第一個捕捉」,這在替換表達式中沒有意義。正則表達式模式不應該在正則表達式之外使用! $1
,$2
等是你應該在那裏使用。
固定\1
後,你有
perl ... -e'... s/.../...$1$varWithLeadingNumber.../ ...'
這麼說,我覺得varWithLeadingNumber
應該是一個shell變量?如果它是一個Perl變量,你不應該有任何問題。如果您在外殼內插varWithLeadingNumber
,這個問題可以用
perl ... -e"... s/.../...\${1}${varWithLeadingNumber}.../ ..."
注意,您將有問題,如果$ varWithLeadingNumber包含「$」,是固定的「@」,「\」或「/」,所以您可能需要使用命令行參數而不是插值。
perl ... -pe'
BEGIN { $val = shift; }
... s/.../...$1$val.../ ...
' "${varWithLeadingNumber}"
您也可以使用環境變量。
export varWithLeadingNumber
perl ... -pe's/.../...$1$ENV{varWithLeadingNumber}.../'
或
varWithLeadingNumber=varWithLeadingNumber \
perl ... -pe's/.../...$1$ENV{varWithLeadingNumber}.../'
如果你確實有一個\1
s/...\1.../.../
就可以避免該問題的許多方面,包括
s/...(?:\1).../.../
你確定你的問題不在shell嗎?除了收集shell變量的部分之外,我會將腳本用單引號括起來,以減少需要擔心的反斜槓的數量。 –
我剛剛試過,例如'perl -pi -e's /( foo <\/tag1> \ n \ s * )[^ \ n] *(<\/tag2>)/ \ g {1} 25 \ g {2}/'file.xml',結果是一樣的。替換文本最終成爲'g {1} 25g {2}'。 –
jonderry