C'est ce que les références sont pour. Entourez simplement la section de texte que vous voulez capturer avec des parenthèses. Le premier ensemble de parenthèses est disponible en $ 1, le deuxième en $ 2, et ainsi de suite.
s/(\s[0-9]\s[0-9]{3})/$1I/
Avec Perl 5.10 nous avons gagné named captures, afin que vous puissiez dire
s/(?<bodytext>\s[0-9]\s[0-9]{3})/$+{bodytext}I/
Le <
et inbetween choses >
est le nom. Les noms deviennent des clés dans la variable %+
et les valeurs sont le texte capturé.
Une autre solution consiste à utiliser un zero-width positive look-behinds
s/(?<=\s[0-9]\s[0-9]{3})/I/
ou son, nouveau à Perl 5.10, raccourci \K
s/\s[0-9]\s[0-9]{3}\K/I/
Essayez
perl -pi -e 's/(\s[0-9]\s[0-9][0-9][0-9])/$1I/' filename
Si vous utilisez doub le guillemet le $ 1 est interpolé par le shell avant que Perl le voit. Si vous avez des problèmes avec quelque chose qui, selon vous, devrait fonctionner, il peut être utile de regarder ce que Perl voit. Vous pouvez le faire avec B::Deparse:
perl -MO=Deparse -pi -e "s/(\s[0-9]\s[0-9][0-9][0-9])/$1I/" filename
qui produira la sortie suivante.
BEGIN { $^I = ""; }
LINE: while (defined($_ = <ARGV>)) {
s/(\s[0-9]\s[0-9][0-9][0-9])/I/;
}
continue {
print $_;
}
-e syntax OK
De cela, nous pouvons voir que $1
manque.Permet de réessayer avec des guillemets simples:
perl -MO=Deparse -pi -e 's/(\s[0-9]\s[0-9][0-9][0-9])/$1I/' filename
BEGIN { $^I = ""; }
LINE: while (defined($_ = <ARGV>)) {
s/(\s[0-9]\s[0-9][0-9][0-9])/$1I/;
}
continue {
print $_;
}
-e syntax OK
Et une fois à l'échappement:
perl -MO=Deparse -pi -e "s/(\s[0-9]\s[0-9][0-9][0-9])/\$1I/" filename
BEGIN { $^I = ""; }
LINE: while (defined($_ = <ARGV>)) {
s/(\s[0-9]\s[0-9][0-9][0-9])/$1I/;
}
continue {
print $_;
}
-e syntax OK
qui est toujours en remplaçant le tout avec I :( –
Avez-vous ajouté les parens? –
ouais c'est ma commande complète perl -pi -e "s/(\ s [0-9] \ s [0-9] [0-9] [0-9])/$ 1I /" testFichier.phy –