Exécutez une commande dans 'sed'

9

J'ai une liste d'adresses mémoire aléatoires enregistrées dans un fichier texte, et je dois sedles extraire, les décoder et les sauvegarder dans mon fichier. Cependant, l'opération de décodage que j'essaie d'effectuer est gérée dans un programme C ++ que j'ai créé il y a quelque temps. Le problème que je rencontre maintenant est l'exécution du C ++ dans la sedcommande; c'est-à-dire que je veux référencer la partie qui doit être décodée et l'utiliser comme argument dans mon programme C ++. J'ai écrit la commande suivante:

cat $1 | sed -r 's/(0[Xx])([0-9A-Za-z]{1,8})/\1`./convAddrs \2`/g';

avant d'avoir eu la chance de lire une réponse dans ce post disant que sedn'exécute PAS les commandes. Est-il vrai que sedcela ne permet pas l'exécution de commandes? Si oui, en supposant que la commande que j'ai écrite est une sedséquence valide , comment pourrais-je l'écrire perl?

Fadi Hanna AL-Kass
la source
lien ajouté. mon mauvais :)
Fadi Hanna AL-Kass

Réponses:

8
perl -pe 's|(?<=0x)[0-9a-f]{1,8}|`./convAddrs $&`|gei'
  • perl -pe: like sed: traite l'entrée une ligne à la fois $_, évalue l'expression xl perl [e] transmise à -echaque ligne et [p] imprime la modification $_pour chacune.
  • s|X|Y|gei: substitue Yà Xin $_([g] lobally, case [i] nsensitively, et traite Ycomme une expression perl [e] au lieu d'une chaîne de base).
  • (?<=0x): regardez derrière 0x.
  • [0-9a-f]{1,8}: un à 8 chiffres hexadécimaux, autant que possible
  • `./convAddrs $&`: remplacez par la sortie de cette ligne de commande shell où $&est remplacée par la partie correspondante.
Stéphane Chazelas
la source
J'obtiens l'erreur suivante lors de l'exécution de votre commande: Aucun espace entre le modèle et le mot suivant n'est déconseillé à la ligne -e 1. Les modificateurs d'expression régulière "/ a" et "/ d" s'excluent mutuellement à la ligne -e 1, à la fin des modificateurs d'expression de ligne "/ a" et "/ d" s'excluent mutuellement à -e ligne 1, à la fin de la ligne Impossible de trouver le terminateur de chaîne "` "n'importe où avant EOF à -e ligne 1.
Fadi Hanna AL-Kass
1
Bien sûr, désolé, vous devez changer le séparateur car nous ne pouvons pas l'utiliser /ici car il est utilisé à l'intérieur de la pièce de rechange. Corrigée.
Stéphane Chazelas
Merde, et je pensais que j'étais assez bon à Perl one liners, +1!
terdon
2

Il peut ou non être vrai qui sedne peut pas exécuter de commandes. Ce n'est pas vrai d'un GNU sed:

sed -Ee 's/(0[Xx])([0-9A-Za-z]{1,8})/\1\n ./convAddrs \2\n#/g' \
-eh -e  's/\n.//gp;g;s/^/#/e' <"$1"

Je ne sais pas exactement quoi d'autre pourrait être dans votre <$1entrée, et donc je prends soin de #commenter tout ce qui n'est pas command \2dans l'espace de motif. Lorsque vous utilisez l' eindicateur xecute de GNU sur une s///ubstitution, il passe l'intégralité de l'espace de motif résultant à $SHELL -cson deuxième argument, puis remplace ensuite tout l'espace de motif par tout ce qui est écrit sur cette $SHELLsortie standard. Donc, ci-dessus, j'imprime quels que soient vos résultats avant d'abord, puis après les résultats du passage de la ligne de commande au shell.

mikeserv
la source