j'ai un (encore ^^) ptit problème avec la commande sed
j'ai besoin de sélectionner certaines lignes d'un fichier texte.
Ces lignes sont délimitées par des balises (similaires à des balise HTML).
en gros un truc du genre :
AA
BB
CC
DD
EE
`Directory`
FF
GG
HH
`/Directory`
Et je voulais supprimer les lignes qui apparaissent entre les balises "Directory" , pour cela , j'ai utilisé la commande Sed suivante :
* sed -e "/`Directory`/,/`\/Directory`/d" test.txt
ce cas "simple" fonctionne (enfin simple... j'ai quand même bien galéré , mais passons ^^)
Petit problème : la première balise contient une variable qui permet de définir dans le code quel 'repertoire' utiliser.
elle ressemble donc plutot à ça :
`Directory "/home/nomUser/TrucsBidules"' `
et c'est la que viens tous le problème , dans le nom de repertoire y'a des '/' (caractère que sed semble avoir du mal à gérer)....
Je dois placer l'adresse dans une variable , donc au final la commande sed ressemble à ça :
sed -e '/`Directory \"$value\"`/,/`\/Directory`/d' monfichier
où
$variable=/home/nomUser/Trucsmachin
Et bien entendu ça ne fonctionne pas ...
Kelk'un aurait une idée sur la démarche à suivre pour régler le problème ?
# sed
Posté par fox (site web personnel) . Évalué à -1.
sed -e 's/+a+b+/'
pour remplacer a par b
[^] # Re: sed
Posté par fox (site web personnel) . Évalué à 1.
sed -e 's+a+b+'
# backslash slash
Posté par bigben99 . Évalué à 1.
Ex:
bruno@silver:/tmp$ cat test.txt
AA
BB
CC
DD
EE
`Directory /home/nomUser/TrucsBidules`
FF
GG
HH
`/Directory`
bruno@silver:/tmp$ cat test.sh
value=/home/nomUser/TrucsBidules
value2=`echo $value | sed -e "s#/#\\\\\/#g"`
echo value2=$value2
sed -e "/\`Directory $value2\`/,/\`\/Directory\`/d" test.txt
bruno@silver:/tmp$ ./test.sh
value2=\/home\/nomUser\/TrucsBidules
AA
BB
CC
DD
EE
bruno@silver:/tmp$
[^] # Re: backslash slash
Posté par dartalouf . Évalué à 1.
C'est marrant comme les solutions sembles "preske" trivial lorsqu'elle sont proposé par les autres ;-)
Merci beaucoup , c'est exactement ce que je voulais faire.
Une dernière question néanmoins , à koi sert cette ligne :
echo value2=$value2
???
(j'ai preske honte de poser la question , mais je vois vraiment pas ce que fait cette ligne ^^)
Merci encore .
Dart
[^] # Re: backslash slash
Posté par bigben99 . Évalué à 1.
echo value2=$value2
A rien, c'était à but didactique. Tu peux la supprimer sans problème.
[^] # Re: backslash slash
Posté par xavier . Évalué à 2.
pour remplacer les slash utilisés pour englober les regexp d'adresses par un autre caractere cela fonctionne comme pour les substitution mais en prefixant le premier par un backslah, dans ton cas une syntaxe de la forme:
\XregexpX,\YregexpYcommande
exemple en utilisant le # comme separateur:
$ cat file
AA
BB
`Directory "./A/B/C/D"`
CC
DD
`/Directory`
EE
FF
$ value='"./A/B/C/D"'
$ sed "\#\`Directory $value\`#,\#\`/Directory\`#d" < file
AA
BB
EE
FF
[^] # Re: backslash slash
Posté par fox (site web personnel) . Évalué à 1.
[^] # Re: backslash slash
Posté par dartalouf . Évalué à 1.
Alors la chapeau....
j'avais effectivement la première solution proposé sans succés (et moi non plus j'était pas bourré ^^)
Bref , bref , merci beaucoup pour ces interventions ...
Le problème du sed est réglé.... en tout cas pour l'instant.
Au final je crois que j'ai pigé la syntaxe de base , mais dès qu'il s'agit de faire des trucs un peu compliqué j'ai tendance à être complètement perdu.
Je comprends mal pourkoi le fait de mettre un # comme séparateur régle le problème 'comme par magie' (enfin j'imagine que c'est pour que le shell ne considère pas les '/' de la variable comme des séparateurs du sed ....).
Et surtout , je pige pas pourkoi dans la solution proposé par BigBen99 , l'inversion de la commande (utilisation de '!d' plutot que de 'd' pour n'afficher que ce qui est dans les balises) est impossible....
Enfin, j'crois que j'suis pas trop doué avec cette commande ;-)
Merci encore.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.