L'utilizzo di \1
, \2
, ecc. Nell'espressione di sostituzione è errato. \1
è un modello di espressione regolare che significa "corrisponde a ciò che corrisponde alla prima acquisizione" che non ha senso in un'espressione sostitutiva. I modelli di espressioni regolari non dovrebbero essere usati al di fuori delle espressioni regolari! $1
, $2
, ecc. È ciò che dovresti usare lì.
Dopo aver fissato \1
, avete
perl ... -e'... s/.../...$1$varWithLeadingNumber.../ ...'
Detto questo, penso che varWithLeadingNumber
si suppone essere una variabile di shell? Non dovresti avere problemi se si tratta di una variabile Perl. Se hai il guscio interpolare varWithLeadingNumber
, il problema può essere risolto utilizzando
perl ... -e"... s/.../...\${1}${varWithLeadingNumber}.../ ..."
noti che si avranno problemi se $ varWithLeadingNumber contiene "$", "@", "\" o "/", così potresti voler usare un argomento da linea di comando invece dell'interpolazione.
perl ... -pe'
BEGIN { $val = shift; }
... s/.../...$1$val.../ ...
' "${varWithLeadingNumber}"
È anche possibile utilizzare una variabile di ambiente.
export varWithLeadingNumber
perl ... -pe's/.../...$1$ENV{varWithLeadingNumber}.../'
o
varWithLeadingNumber=varWithLeadingNumber \
perl ... -pe's/.../...$1$ENV{varWithLeadingNumber}.../'
Se si ha avuto un \1
s/...\1.../.../
è possibile evitare il problema di un certo numero di modi tra cui
s/...(?:\1).../.../
Sei sicuro che il tuo problema non sia con la shell? Allegherei lo script tra virgolette singole eccetto per la parte che raccoglie le variabili della shell, giusto per ridurre il numero di backslash di cui preoccuparsi. –
Ho appena provato, per esempio, 'perl -0pi -e 's/( pippo <\/tag1> \ n \ s * ) [^ \ n] * (<\/tag2>)/\ g {1} 25 \ g {2}/'file.xml', e il risultato è stato lo stesso. Il testo sostitutivo finisce con "g {1} 25g {2}'. –
jonderry