J'essaie de trouver un modèle en utilisant sed
commande dans file.txt
entre le premier car1 et char2 puis remplacez-le par une chaîne. comme ci-dessous avec echo
exemple de mode :
echo "This X is test Y. But X is not test Y." | sed 's/X[^Y]*Y/REPLACE/'
J'ai aussi besoin de sauvegarder le modèle correspondant (comme is test
{<–les espaces autour sont importants} ) dans une variable.
Réponse acceptée :
Voici une seule invocation de sed qui écrit la ligne révisée sur stdout tout en enregistrant le texte supprimé dans la variable shell var
:
$ var=$(echo "This X is test Y. But X is not test Y." | sed -nr 'h;s/[^X]*X([^Y]*)Y.*/\1/;p;x;s/X[^Y]*Y/REPLACE/;w /dev/stderr') 2>&1
This REPLACE. But X is not test Y.
La valeur de var
est :
$ echo "==$var=="
== is test ==
Explication :
-
h
Cette commande copie le motif actuel dans l'espace de maintien.
-
s/[^X]*X([^Y]*)Y.*/\1/;p
Cela supprime tout de l'espace de modèle sauf le texte entre le premier
X
etY
y compris tous les espaces. Ceci est ensuite imprimé sur stdout. C'est la sortie qui est capturée par le shell et assignée àvar
. -
x
Cela recopie l'espace de maintien dans l'espace de motif. Lorsque cela est fait, l'espace de modèle contient une copie de la ligne d'entrée d'origine.
-
s/X[^Y]*Y/REPLACE/; w /dev/stderr
La substitution est effectuée et le résultat est écrit dans
stderr
. -
2>&1
Une fois que le shell a capturé stdout dans
var
, cela indique au shell de copier stderr (qui a la ligne avec REPLACE) dans stdout.
A part le traitement de la variable var
La variable var
comprend les espaces de début et de fin. Si le shell devait subséquemment soumettre var
au fractionnement des mots, ces espaces seraient supprimés. Pour éviter cela, lorsque var
est référencé, faites-le entre guillemets doubles, comme dans l'exemple ci-dessus.