web-dev-qa-db-fra.com

Comment remplacer un caractère dans un motif correspondant à l'aide de l'esperluette (&)

Lorsque nous faisons correspondre un modèle à l'aide de sed, le modèle correspondant est stocké dans la variable "esperluette" (&). IS existe-t-il un moyen de remplacer un caractère dans ce modèle apparié en utilisant l'esperluette elle-même?

Par exemple, si & contient la chaîne "Apple1", comment puis-je utiliser & pour transformer la chaîne en "Apple2" (c'est-à-dire remplacer 1 par 2)?

18
user1418321

Si j'ai bien deviné, ce que vous voulez faire, c'est appliquer une souscription selon un schéma assorti. Vous ne pouvez pas faire cela en utilisant &. Vous voulez le faire à la place:

echo Apple1 Apple3 Apple1 Apple2 botemo1 | sed '/Apple./ { s/Apple1/Apple2/g; }'

Cela signifie que vous souhaitez exécuter la substitution de commandes uniquement sur les lignes correspondant au modèle /Apple./.

23
Elias Dorneles

Vous pouvez également utiliser un groupe de capture. Une capture est utilisée pour saisir une partie de la correspondance et l'enregistrer dans une variable auxiliaire, nommée numériquement dans l'ordre d'apparition de la capture.

echo Apple1 | sed -e 's/\(a\)\(p*\)\(le\)1/\1\2\32/g'

Nous avons utilisé trois captures:

  1. Le premier, stocké dans \1, contient un "a"
  2. Le second, stocké dans \2, contient une séquence de "p" (dans l'exemple il contient "pp")
  3. Le troisième, stocké dans \3, contient la séquence "le"

Nous pouvons maintenant imprimer le remplacement en utilisant les correspondances que nous avons capturées: \1\2\32. Notez que nous utilisons 3 valeurs de capture pour générer "Apple", puis nous ajoutons un 2. Cela ne sera pas interprété comme variable \32 car nous ne pouvons avoir qu'un total de 9 captures.

J'espère que cela aide =)

vous pouvez d'abord faire correspondre un motif, puis modifier le texte s'il correspond:

echo "Apple1" | sed '/Apple/s/1/2/'    # gives you "Apple2"

ce code change 1 à 2 dans toutes les lignes contenant Apple

13
none

Cela pourrait fonctionner pour vous (GNU sed et Bash):

sed 's/Apple1/sed "s|1|2|" <<<"&"/e' file
2
potong