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 :
-
hCette commande copie le motif actuel dans l'espace de maintien.
-
s/[^X]*X([^Y]*)Y.*/\1/;pCela supprime tout de l'espace de modèle sauf le texte entre le premier
XetYy 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. -
xCela 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/stderrLa substitution est effectuée et le résultat est écrit dans
stderr. -
2>&1Une 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.