#1 Le 15/04/2012, à 12:26
- Christophe C
[Résolu] Substitution de chaines dans un fichier
Bonjour, j'essaie de me dépatouiller avec sed, et c'est que du bonheur
Je souhaite aller dans un fichier toto.sh ou se trouve une ligne
sleep xm
ou x est un nombre de minutes inconnu, pouvant s'écrire sur 1 ou 2 caractères. Donc je ne connais pas le contenu exacte de ma chaine, ni sa longueur. Je sais par contre qu'elle commence par sleep et se termine par m (minutes).
L'emplacement de la ligne est inconnu, mais c'est la première occurrence de sleep que je cherche.
J'avoue que la syntaxe user-friendly de sed me déroute un peu.
Dernière modification par Christophe C (Le 15/04/2012, à 16:38)
BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».
Hors ligne
#2 Le 15/04/2012, à 13:06
- pingouinux
Re : [Résolu] Substitution de chaines dans un fichier
Bonjour,
Ceci devrait marcher :
sed -nr '/^sleep +[0-9]+m$/{p;q}' toto.sh
Explication :
^sleep : sleep en début de ligne
+ : un ou plusieurs espaces
[0-9]+ : un ou plusieurs chiffres de 0 à 9
m$ : m en fin de ligne
{p;q} : On imprime la ligne, et on quitte
Dernière modification par pingouinux (Le 15/04/2012, à 13:33)
Hors ligne
#3 Le 15/04/2012, à 15:50
- Christophe C
Re : [Résolu] Substitution de chaines dans un fichier
non, cela ne marche pas. Je ne comprend d'ailleurs pas bien ou j'indique ma substitution de chaine. Nul part ?
Disons que ma ligne à traiter (dans toto.sh) est
sleep 10
Que dois-je taper si je veux que cela devienne sleep 5 ? j'ai testé sed -nr '/^sleep +[5]+m$/{p;q}' toto.sh, mais ça n'est pas ça.
BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».
Hors ligne
#4 Le 15/04/2012, à 16:23
- pingouinux
Re : [Résolu] Substitution de chaines dans un fichier
D'après ton message #1, j'avais compris que tu cherchais la première occurrence de sleep xm dans le fichier, et que tu voulais imprimer cette ligne.
En définitive, quel est le but de la manœuvre ? Remplacer dans le fichier la ligne trouvée par sleep 5 ?
Et y a-t-il un m en fin de ligne (il y en a un en #1, mais pas en #3) ?
Hors ligne
#5 Le 15/04/2012, à 16:38
- Christophe C
Re : [Résolu] Substitution de chaines dans un fichier
Oui, c'est bien d'une substitution dont il s'agit, par exemple sleep 10m par sleep 20m
Moyennant quoi, je viens juste d'arriver à mon but en mettant une ligne de perl dans mon script bash :
perl -i -p -e 's|sleep.*|sleep '$VALUE1'm |g' "/home/chris/Documents/Scripts/toto.sh"
où $VALUE1 est ne valeur en minute (par exemple 10), et ou le fichier ou j'écris est toto.sh.
Le perl a l'air plus simple que le bash, pour les substitutions.
BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».
Hors ligne
#6 Le 15/04/2012, à 16:49
- sputnick
Re : [Résolu] Substitution de chaines dans un fichier
VALUE=999
sed -ri "s|^sleep[[:space:]]+[0-9]{1,2}m[[:space:]]*|sleep ${VALUE}m|" FICHIER
Par contre tu a très mal exposé ton problème, essaye de faire mieux la prochaine fois.
Dernière modification par sputnick (Le 15/04/2012, à 16:55)
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#7 Le 15/04/2012, à 17:04
- pingouinux
Re : [Résolu] Substitution de chaines dans un fichier
L'emplacement de la ligne est inconnu, mais c'est la première occurrence de sleep que je cherche.
N'est-ce pas juste la première occurrence de sleep qui doit être modifiée ? Les scripts en #5 et #6 les modifient toutes.
S'il ne faut modifier que la première :
awk -v VALUE=55 '/^sleep +[0-9]+m*$/{if(!fin){$0="sleep "VALUE"m";fin=1}}{print}' toto.sh
Hors ligne
#8 Le 15/04/2012, à 17:22
- Christophe C
Re : [Résolu] Substitution de chaines dans un fichier
oui, seulement la première. mais dans ce script, il n'y a qu'une occurrence, donc l'erreur ne se voyait pas.
Désolé pour le manque de clareté de l'explication.
Dans l'explication de pingouinux, je ne comprend pas bien le sleep +[0-9] cela veut-il dire qu'il peut y avoir de 0 à 9 caractères après sleep+espace ? Ou cela signifie t'il que la valeur peut-être de 0 à 9 ?
C'est monstrueux, comme syntaxe
Dernière modification par Christophe C (Le 15/04/2012, à 17:25)
BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».
Hors ligne
#9 Le 15/04/2012, à 17:29
- pingouinux
Re : [Résolu] Substitution de chaines dans un fichier
Il y a une petite explication de la syntaxe pour sed en #2, et c'est la même pour awk.
Hors ligne
#10 Le 15/04/2012, à 18:03
- Christophe C
Re : [Résolu] Substitution de chaines dans un fichier
Oui, je l'avais lu, mais justement, je n'avais pas compris ce point.
BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».
Hors ligne
#11 Le 15/04/2012, à 18:21
- pingouinux
Re : [Résolu] Substitution de chaines dans un fichier
Dans une Expression Régulière :
+ veut dire que le caractère qui précède doit apparaître une ou plusieurs fois
[0-9] représente un chiffre de 0 à 9
sleep +[0-9]+ représente "le mot sleep suivi d'un ou plusieurs espaces suivi(s) d'un nombre quelconque de chiffres"
Hors ligne
#12 Le 16/04/2012, à 07:02
- Christophe C
Re : [Résolu] Substitution de chaines dans un fichier
ok. Merci.
BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».
Hors ligne