SED : Comment faire pour remplacer un caractère dans un motif correspondant à l'aide de l'esperluette (&)
Lorsque nous correspondre à un modèle à l'aide de sed, le motif correspondant est stocké dans le "et commercial" (&) variable. EST-il un moyen de remplacer un caractère dans ce motif correspondant à l'aide de l'esperluette lui-même ?
Par exemple, si & contient la chaîne "apple1", comment puis-je utiliser & pour rendre la chaîne de "apple2" (j'.e remplacer le 1 par 2) ?
Ce n'est pas la façon dont vous utilisez
&
. Cela pourrait aider si vous l'avez expliqué pourquoi vous avez voulu faire.OriginalL'auteur user1418321 | 2012-10-02
Vous devez vous connecter pour publier un commentaire.
Si j'ai deviné juste, ce que vous voulez faire est d'appliquer un remplacement dans un modèle de correspondance. Vous ne pouvez pas le faire à l'aide de
&
. Vous voulez faire ceci à la place:Cela signifie que vous souhaitez exécuter la commande de substitution uniquement sur les lignes qui correspond au modèle
/apple./
.sed 's/apple1/apple2/g'
. Parce que je veux utilisersed '/apple./ { s/1/2/g; }'
et il changebotemo2
qui est totalement contre-intuitif.Chose est sed est orienté ligne, de sorte
/apple./
signifie: appliquer les commandes de suivre uniquement les lignes qui correspondent au modèle. Depuisbotemo1
est dans la même ligne, sed va appliquer la substitution pour elle aussi.OriginalL'auteur elias
Vous pouvez également utiliser un groupe de capture. Une capture est utilisé pour saisir une partie de la correspondance et de l'enregistrer dans une variable auxiliaire, qui est nommé numériquement dans l'ordre que la capture s'affiche.
Nous avons utilisé trois capture:
\1
, contient une "une"\2
, contient une séquence de "p"s (dans l'exemple, il contient de "pp")\3
, contient la séquence "le"Maintenant, nous pouvons imprimer le remplacement en utilisant les matches que nous avons capturés:
\1\2\32
. Notez que nous sommes à l'aide de 3 capture de valeurs à générer de la "pomme" et ensuite, nous ajoutons un 2. Ce ne sera pas interprété comme variable\32
parce que nous n'en avons un total de 9 capture.Espère que cette aide =)
Les références arrières sont conçus pour vous reportant à "stockée correspond à" (OP libellé); et la question est sur le remplacement d'une chaîne de caractères DANS ceux, pas AVEC ceux-ci.
Ajout d'un exemple de 7heo.les savoirs traditionnels commentaire. Vous pouvez utiliser des références comme:
sed -e 's/\(a\)\(p*\)\(le\)1 \1\2\32/\1\2\33 \1\2\34/'
remplaceraapple1 apple2
avecapple3 apple4
, et qu'il serait aussi travailler (si vous voulez) avecappple1 appple2
, résultant enappple3 appple4
. Cependant, il ne serait pas remplacerapple1 aple2
, niappple1 apple2
, niapple1 appple2
, parce qu'ils n'ont pas la même chaîne stockée dans la capture (ie. lorsque l'on compare les mots, ils ne sont pas les mêmes).Je ne savais pas que vous pouvez utiliser les références arrières dans la partie de match de la regex. Savez-vous si c'est POSIX?
Oui, AFAICT, c'est une partie de la BRE (de base des expressions régulières) que chaque POSIX capable sed devrait mettre en œuvre (pubs.opengroup.org/onlinepubs/007904975/basedefs/...).
OriginalL'auteur Janito Vaqueiro Ferreira Filho
vous pouvez d'abord correspondre à un modèle et ensuite modifier le texte si en correspondance:
ce code change
1
à2
dans toutes les lignes contenantapple
sed
mieux après la lecture de cette réponse.OriginalL'auteur none
Cela pourrait fonctionner pour vous (GNU sed et Bash):
OK, travaillé... Normalement, le "remplacement" de la chaîne est insérée, mais GNU sed utilise le
e
drapeau de l'exécuter et de l'insérer à sa sortie à la place. La commande exécutée passe&
(le motif correspondant) comme une chaîne ici poursed "s|1|2"
, où|
prend la place de la plus classique/
.OriginalL'auteur potong