Problème d'alias

dna.factory Messages postés 25996 Date d'inscription   Statut Modérateur Dernière intervention   -  
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je travaille sur un script sh, et fatalement, je me retrouve régulièrement avec les même séries de commandes.
J'ai donc décidé d'utiliser les alias.

En particulier j'en utilise 2
un Query = "psql -U compte|head -n-2|tail -n+3"
qui fonctionne très bien (j'ai fait le shopt expand)

Par contre, je voudrais utiliser un Unxml, et là je bloque.
La commande que je veux aliaser est la suivante :
awk -F">" '{print $2}'|awk -F"<" 'print $1'
Quand j'utilise cette commande dans le corps du script, elle fonctionne bien.

Problème, à cause des apostrophes, je peux pas faire de
alias Unxml="awk -F">" '{print $2}'|awk -F"<" 'print $1'"
'{print }': No such file or directory

j'ai essaye d'utiliser des apostrophes simples pour le -F
pas d'erreur, mais pas d'execution non plus

J'ai essayé de virer complètement les apostrophes :
awk: option -F lacks argument

J'ai essayé d'échapper les apostrophes avec des \
Pas d'erreur, mais pas d'execution non plus.

Je connais pas les codes à mettre à la places des apostrophes ou des ><, maintenant, je sais pas si ça marcherait vraiment...

en soit, grâce au copier coller, c'est pas la mort (ça fait un an que j'ai le problème), mais cette commande est utilisées une 20aines de fois, donc pour la lisibilité et la légèreté, c'est toujours bon à prendre



A voir également:

2 réponses

zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430
 
Salut,

awk -F">" '{print $2}'|awk -F"<" 'print $1'
Et d'un apparemment il n'y a pas de source d'entrée (fichier) pour le 1er awk et dans le 2ème il manquerait les accolades, non ? ;-\
0
dna.factory Messages postés 25996 Date d'inscription   Statut Modérateur Dernière intervention   1 618
 
pour le deuxième awk c'est une erreur de recopie, y'a bien les accolades normalement
pour le manque de fichier source, c'est fait exprès, c'est le principe de l'alias.
une fois défini mon alias de la façon suivante
alias Unxml="awk -F">" '{print $2}'|awk -F"<" '{print $1}'"


en résumé :
grep Number fichier.xml (ou cat fichier.xml |grep Number)
<exportNumber>90</exportNumber>
grep Number fichier.xml|awk -F ">" '{print $2}'|awk -F "<" '{print $1}'
90
(y'a peut-être plus intelligent pour déparser, voir même avec des outils tout prêt, mais bon, ça marche et c'est moi qui l'ai fait :)).

J'aurais donc voulu pouvoir faire
grep Number fichier.xml|Unxml


Je l'ai fait avec le Query comme indique plus haut, et ça fonctionne, donc le principe est valable
alias Query = "psql -U compte|head -n-2|tail -n+3"
echo "requete"|Query
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430 > dna.factory Messages postés 25996 Date d'inscription   Statut Modérateur Dernière intervention  
 
Ok, alors c'est peut être un problème de quote ;-\

Essaie comme ça :
alias Unxml="awk -F\">\" '{print $2}'|awk -F\"<\" '{print $1}'" 
0
dna.factory Messages postés 25996 Date d'inscription   Statut Modérateur Dernière intervention   1 618
 
J'ai essayé... ça marche pas...
juste pour être sur que c'est pas une histoire d'espace, voila ce que j'avais tappé :
alias Unxml="awk -F\">\" '{print $2}'|awk -F\"<\" '{print $1}'"

pas d'erreur, mais ça ne marche pas.
j'ai terminé ma journée, c'est noyel...
je reprendrais le dossier vendredi.
Après, comme je dit, c'est pas bloquant
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430 > dna.factory Messages postés 25996 Date d'inscription   Statut Modérateur Dernière intervention  
 
;-\

Alors essaie de créer une fonction plutôt qu'un alias...
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430 > dna.factory Messages postés 25996 Date d'inscription   Statut Modérateur Dernière intervention  
 
Une autre piste, échapper aussi les "$" :

alias Unxml="awk -F\">\" '{print \$2}'|awk -F\"<\" '{print \$1}'"
0
dna.factory Messages postés 25996 Date d'inscription   Statut Modérateur Dernière intervention   1 618
 
Avec les fonctions

UnXml()
{
echo $1 |awk -F ">" '{print $2}'|awk -F "<" '{print $1}'
}

UnXml `cat chemin/fichier.xml|grep Field` > /tmp/test.dna
cat /tmp/test.dna


le résultat est celui souhaité.
Je suis pas sur que ça sera aussi simple à utiliser qu'un alias, mais c'est déjà ça de pris.
0
dna.factory Messages postés 25996 Date d'inscription   Statut Modérateur Dernière intervention   1 618
 
Il me reste un petit soucis (rien d'insurmontable, on est dans l'ordre du cosmétique/réduction de code).
si je retourne directement mon résultat, pas de soucis pour utiliser la fonction,
par contre, si je veux le stocker dans une mémoire, j'y arrive pas vraiment
La méthode qui fonctionne :
test2=`cat /chemin/fichier|grep Field`
test2=`UnXml $test2`

Est quand même mieux que l'absence de fonction, mais ça me force à rajouter une ligne.
j'ai essayé, le
test3=`UnXml `cat /chemin/fichier|grep Field``

mais 'bizarrement', ça n'a mas marché
j'ai essayé avec des parenthèses
`UnXml (commande)`

J'ai une erreur (substitution)
et des accolades
`UnXml { commande }` 

j'ai pas d'erreur, mais aucun affichage.
(idem pour apostrophes et guillemets, pas d'erreur, mais pas de retour)
0
dna.factory Messages postés 25996 Date d'inscription   Statut Modérateur Dernière intervention   1 618
 
ho et le petit malin (oui, c'est de toi que je parle) qui me dit que :
test2=`cat /chemin/fichier|grep Field`;test2=`UnXml $test2`

Ca fait une seule ligne, j'y ai déjà pensé :)
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637 > dna.factory Messages postés 25996 Date d'inscription   Statut Modérateur Dernière intervention  
 
hello
et comme ça
$ UnXml() { awk -F "[<>]" '{print $3}' <<<"$1" ; }
$ UnXml "$(cat fichier)"
0
dna.factory Messages postés 25996 Date d'inscription   Statut Modérateur Dernière intervention   1 618
 
F "[<>]"
J'ai bien compris ?
On peut mettre de la regex dans le -F ?
je savais qu'on pouvait mettre des chaines, mais j'avais pas pensé au regex...
C'est über puissant :)
(dans certains cas, je faisait du sed avant le awk pour remplacer certains caractères par d'autres et avoir un seul séparateur, finalement, j'avais pas besoin...)
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
oui, FS peut-être regex ou chaine de car.
http://www.gnu.org/software/gawk/manual/gawk.html#Field-Separators
0