Problème d'alias

dna.factory Messages postés 29146 Statut Modérateur -  
dubcek Messages postés 19021 Statut Contributeur -
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 38797 Statut Contributeur 6 433
 
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 29146 Statut Modérateur 1 619
 
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 38797 Statut Contributeur 6 433 > dna.factory Messages postés 29146 Statut Modérateur
 
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 29146 Statut Modérateur 1 619
 
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 38797 Statut Contributeur 6 433 > dna.factory Messages postés 29146 Statut Modérateur
 
;-\

Alors essaie de créer une fonction plutôt qu'un alias...
0
zipe31 Messages postés 38797 Statut Contributeur 6 433 > dna.factory Messages postés 29146 Statut Modérateur
 
Une autre piste, échapper aussi les "$" :

alias Unxml="awk -F\">\" '{print \$2}'|awk -F\"<\" '{print \$1}'"
0
dna.factory Messages postés 29146 Statut Modérateur 1 619
 
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 29146 Statut Modérateur 1 619
 
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 29146 Statut Modérateur 1 619
 
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 19021 Statut Contributeur 5 637 > dna.factory Messages postés 29146 Statut Modérateur
 
hello
et comme ça
$ UnXml() { awk -F "[<>]" '{print $3}' <<<"$1" ; }
$ UnXml "$(cat fichier)"
0
dna.factory Messages postés 29146 Statut Modérateur 1 619
 
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 19021 Statut Contributeur 5 637
 
oui, FS peut-être regex ou chaine de car.
http://www.gnu.org/software/gawk/manual/gawk.html#Field-Separators
0