GNU/Linux >> Tutoriels Linux >  >> Linux

Les drapeaux sed e et g ne fonctionnent pas ensemble

Les drapeaux fonctionnent ensemble à l'opposé de ce que vous attendez. La documentation de /e est, pour mémoire :

Cette commande permet de diriger l'entrée d'une commande shell vers l'espace de modèle. Si une substitution a été effectuée, la commande trouvée dans l'espace de modèle est exécutée et l'espace de modèle est remplacé par sa sortie. Une nouvelle ligne de fin est supprimée ; les résultats sont indéfinis si la commande à exécuter contient un caractère nul. Il s'agit d'une extension GNU sed.

C'est un peu tortueux écrit. Cela signifie qu'après l'achèvement d'un s/// commande pour cette ligne, s'il y a eu un changement, la (nouvelle) ligne est exécutée comme une commande et sa sortie utilisée en remplacement de cette ligne.

Donc, pour votre commande donnée :

echo AAA | sed -r 's/A/echo B/ge'

il remplace d'abord chaque A avec echo B , et puis exécute le résultat sous forme de commande. Cela a (en gros) le même effet que :

echo AAA | sed -r 's/A/echo B/g' | sh

GNU sed ne prend pas directement en charge le mode que vous souhaitez, bien que vous puissiez le simuler avec un script plus complexe si vous le souhaitez. Alternativement, le /e de Perl modificateur à son s La commande a le comportement que vous recherchez, mais avec des expressions Perl à la place.


Vous êtes obtenir plusieurs remplacements, mais vous n'obtenez pas plusieurs exécutions. Le pattern est exécuté une fois tous les remplacements effectués.

Sans le e marquer le résultat de

echo AAA | sed -r 's/A/echo B/g'

est

echo Becho Becho B

C'est donc la ligne de commande qui est exécutée si vous faites inclure le e flag, qui équivaut à

echo 'Becho Becho B'

Pour obtenir 'BBB' à partir de 'AAA' en utilisant la commande 's' de GNU sed avec le drapeau 'e', ​​on peut faire ceci :

echo AAA | sed -re 's/A/echo -n B;/ge'

Le 'AAA' est remplacé par 'echo -n B;echo -n B; echo -n B;', qui, lorsqu'il est finalement exécuté, conduit à 3 commandes echo s'exécutant séquentiellement, une pour chacune des correspondances globales. Le '-n' omet les caractères de saut de ligne de la sortie d'echo, ce qui fait que les 'B' se retrouvent sur une seule ligne (mais sed ajoute un saut de ligne tout seul lors de l'impression finale de l'espace du motif).


Linux
  1. id :commande introuvable

  2. w :commande introuvable

  3. df :commande introuvable

  4. du :commande introuvable

  5. echo :commande introuvable

La commande manuelle ne fonctionne pas ?

16 exemples pratiques et utiles de la commande Echo sous Linux

La commande Traceroute ne fonctionne pas sur Ubuntu

Faire travailler sudo et nohup ensemble

La commande de date Linux ne fonctionne pas

Pourquoi ma crontab ne fonctionne-t-elle pas et comment puis-je la dépanner ?