Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2760 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  [script zsh] possibilité de faire ça en une ligne ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[script zsh] possibilité de faire ça en une ligne ?

n°1087428
freewol
Ceci n'est pas une citation
Posté le 04-11-2008 à 17:05:09  profilanswer
 

Bonjour,
 
je fais ça dans plusieurs scripts :


a=$2
 
for i in `seq 1 $1`; do
 a=$a:h
done


 
Si on fournit les arguments "2" et "/home/toto/desktop" ça renvoie "/home/", donc ça "remonte" de 2 répertoires.
 
Ca marche très bien, mais je trouve ça un peu moche, du coup je me demandais s'il était possible de réaliser la même chose en une ligne, par exemple s'il y a déjà une commande zsh qui fait ça ?
 
Merci d'avance :)
 

mood
Publicité
Posté le 04-11-2008 à 17:05:09  profilanswer
 

n°1087647
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 05-11-2008 à 16:20:24  profilanswer
 

Tu peux utiliser sed pour cela.

 

Ce que tu veux faire au premier niveau :

/home/toto/desktop => /home/toto/


c'est à dire remplacer /desktop par /

  

au second niveau :

/home/toto/desktop => /home/


c'est à dire remplacer /toto/desktop par /

  

au troisième niveau :

/home/toto/desktop => /


c'est à dire remplacer /home/toto/desktop par /

 


Bref au niveau n on remplace les n derniers /toto par /

   

/toto ça s'écrit avec des expressions régulières :
/ =>  le caractère /
[^/]*  =>  n'importe quel caractère qui n'est PAS /, une ou plusieurs fois de suite
Donc /[^/]*

 

/toto/tutu/titi... n fois, c'est pas très dur en repartant du truc précédent :
(/[^/]*){n} : en noir l'expression précédente pour /toto, en bleu le côté 'n fois'

 


Les n derniers /toto/tutu ça s'écrit (en repartant encore du truc précédent) :
(/[^/]*){n}$ : le $ est une ancre présente à la fin de la chaine de caractère. Ainsi on doit trouver "/toto n fois" (en noir) puis la fin de chaine.

 


Soit au final (/[^/]*){n}$

  


Maintenant la syntaxe de sed :

echo "chaine de caractères" | sed 's_ancien truc_nouveau truc_'

 

Le nouveau truc c'est / (cf. plus haut, à chaque niveau on remplace par /)
L'ancien c'est l'expression pour les n derniers /toto/tutu, sauf que pour tout foutre dans sed, on doit utiliser \( au lieu de (  et \{ au lieu de {
C'est (encore) moins lisible du coup :D

  

Au final :

$  echo "/home/toto/desktop" | sed 's_\(/[^/]*\)\{1\}$_/_'
/home/toto/

 

$  echo "/home/toto/desktop" | sed 's_\(/[^/]*\)\{2\}$_/_'
/home/

 

$  echo "/home/toto/desktop" | sed 's_\(/[^/]*\)\{3\}$_/_'
/

  


Bref tout ça pour dire que si tu ne connais pas les expressions régulières c'est pas simple en une ligne je pense  :D

Message cité 2 fois
Message édité par Xavier_OM le 05-11-2008 à 16:24:54

---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
n°1087648
black_lord
Modérateur
Truth speaks from peacefulness
Posté le 05-11-2008 à 16:28:18  profilanswer
 

freewol a écrit :

Bonjour,
 
je fais ça dans plusieurs scripts :


a=$2
 
for i in `seq 1 $1`; do
 a=$a:h
done


 
Si on fournit les arguments "2" et "/home/toto/desktop" ça renvoie "/home/", donc ça "remonte" de 2 répertoires.
 
Ca marche très bien, mais je trouve ça un peu moche, du coup je me demandais s'il était possible de réaliser la même chose en une ligne, par exemple s'il y a déjà une commande zsh qui fait ça ?
 
Merci d'avance :)
 


 
ne jamais utiliser de spécificité liée à un shell dans un script, faire ses shebang avec /bin/sh [:klem3i1]


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
n°1087699
matafan
Posté le 05-11-2008 à 21:05:26  profilanswer
 

Ouais comme ça quand tu te trouve sur une machine où sh est un lien vers bsh, y'a plus rien qui marche (c'est du vécu).

n°1087701
black_lord
Modérateur
Truth speaks from peacefulness
Posté le 05-11-2008 à 21:13:58  profilanswer
 

matafan a écrit :

Ouais comme ça quand tu te trouve sur une machine où sh est un lien vers bsh, y'a plus rien qui marche (c'est du vécu).


 
bash est compatible sh, si tu utilises pas de "basherie" (comme précisé) ça pose pas de soucis.


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
n°1087725
matafan
Posté le 05-11-2008 à 22:20:09  profilanswer
 

bsh (bourne shell) est bien plus limité que sh

n°1087744
black_lord
Modérateur
Truth speaks from peacefulness
Posté le 05-11-2008 à 23:17:56  profilanswer
 

chez moi bsh c'est "beanshell". je parle de shells compatibles sh. Et encore une fois, que le shell soit plus limité que sh constitue une spécificité.


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
n°1087779
sorg
trop sur HFR depuis 2001
Posté le 06-11-2008 à 08:04:03  profilanswer
 

Xavier_OM a écrit :

Tu peux utiliser sed pour cela.
 
Ce que tu veux faire au premier niveau :

/home/toto/desktop => /home/toto/


c'est à dire remplacer /desktop par /
 
 
 
au second niveau :

/home/toto/desktop => /home/


c'est à dire remplacer /toto/desktop par /
 
 
 
au troisième niveau :  

/home/toto/desktop => /


c'est à dire remplacer /home/toto/desktop par /
 
 
Bref au niveau n on remplace les n derniers /toto par /
 
 
 
 
 
/toto ça s'écrit avec des expressions régulières :
/ =>  le caractère /
[^/]*  =>  n'importe quel caractère qui n'est PAS /, une ou plusieurs fois de suite
Donc /[^/]*
 
/toto/tutu/titi... n fois, c'est pas très dur en repartant du truc précédent :
(/[^/]*){n} : en noir l'expression précédente pour /toto, en bleu le côté 'n fois'
 
 
Les n derniers /toto/tutu ça s'écrit (en repartant encore du truc précédent) :
(/[^/]*){n}$ : le $ est une ancre présente à la fin de la chaine de caractère. Ainsi on doit trouver "/toto n fois" (en noir) puis la fin de chaine.
 
 
Soit au final (/[^/]*){n}$
 
Putain, les regexp à chaque fois que j'en vois , ca me fout la migraine ! :D
En tout cas, bravo et merci pour l'explication didactique !
 
 
 
 
Maintenant la syntaxe de sed :

echo "chaine de caractères" | sed 's_ancien truc_nouveau truc_'


 
Le nouveau truc c'est / (cf. plus haut, à chaque niveau on remplace par /)
L'ancien c'est l'expression pour les n derniers /toto/tutu, sauf que pour tout foutre dans sed, on doit utiliser \( au lieu de (  et \{ au lieu de {  
C'est (encore) moins lisible du coup :D
 
 
 
Au final :

$  echo "/home/toto/desktop" | sed 's_\(/[^/]*\)\{1\}$_/_'
/home/toto/
 
$  echo "/home/toto/desktop" | sed 's_\(/[^/]*\)\{2\}$_/_'
/home/
 
$  echo "/home/toto/desktop" | sed 's_\(/[^/]*\)\{3\}$_/_'
/


 
 
 
 
Bref tout ça pour dire que si tu ne connais pas les expressions régulières c'est pas simple en une ligne je pense  :D


n°1087793
freewol
Ceci n'est pas une citation
Posté le 06-11-2008 à 10:06:44  profilanswer
 

Xavier_OM a écrit :

Tu peux utiliser sed pour cela.
 
[snip]
 
Au final :

$  echo "/home/toto/desktop" | sed 's_\(/[^/]*\)\{1\}$_/_'
/home/toto/
 
$  echo "/home/toto/desktop" | sed 's_\(/[^/]*\)\{2\}$_/_'
/home/
 
$  echo "/home/toto/desktop" | sed 's_\(/[^/]*\)\{3\}$_/_'
/


 
 
Bref tout ça pour dire que si tu ne connais pas les expressions régulières c'est pas simple en une ligne je pense  :D


 
Ouah, merci pour l'explication détaillée :)
Effectivement c'est assez illisible le code sed ;) Mais à la limite avec un bon commentaire à côté ça peut passer. Surtout qu'apparemment ça serait plus portable que mon bout de code.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  [script zsh] possibilité de faire ça en une ligne ?

 

Sujets relatifs
Redirection de script avec argumentsenvoyer le flux d'erreur d'un script dans un mail
Que Choisir ? Paiement En ligne pour Site (PayBox / Klik and Pay/ Worl[Resolu] expect Script
Quel moteur pour boutique en ligne ???echo off comme sous windows lors d'un shell script
[résolu]Script automatisation FTP + execution binairescript et ssh sous redhat
Script sous linuxModification de la sortie standard dans un script
Plus de sujets relatifs à : [script zsh] possibilité de faire ça en une ligne ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR