Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 hmm

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 smile 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. wink

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

Christophe C #1 a écrit :

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 tongue

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