BASH remplacer une chaine par une autre en suivant un motif.

BASH remplacer une chaine par une autre en suivant un motif. - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 08-03-2007 à 19:40:21    

Bonjour,
C'est un peu plus compliqué que dans le titre en fait, je souhaiterais faire des remplacements un peu genre sscanf de C il me semble.
Je m'explique si on considère la chaîne suivante
                              ...
                              #Coucou# LE texte que je veux garder #
                              ...
Je souhaite remplacer #coucou# par une fonction genre "fonction(" et remplacer le dernier  # par ). Tout en conservant le milieu.
Ca c'est facile en deux étapes...  
 
Oui mais en fait, le dernier # ne doit pas forcement être remplacé par une parenthèse fermée.
Ce qui serait bien donc c'est une fonction en bash qui fait ceci:
                               je reconnais:                     #Coucou# quelque chose #
                               je le remplace par:            fonction(quelque chose)
Elle accepterait trois  paramètres dans l'idéal:
                                         "fichier"                     => fichier à traiter
                                         "#coucou#%s#"      => motif à rechercher
                                         "fonction(%s)"           => chaîne de remplacement.
 
Ensuite je fait la fonction pour toutes les possibilités (peut nombreuse) de #type#quelque chose#.
 
C'est en fait une sorte de conversion de langage balisé que je souhaite faire.
Il y a peu être un moyen avec sed mais je vois pas comment...
 
Je sais pas si je suis très clair mais bon...
Si quelqu'un a déjà eu ce genre d'idée... :)  
merci d'avance

Reply

Marsh Posté le 08-03-2007 à 19:40:21   

Reply

Marsh Posté le 09-03-2007 à 13:37:11    

man tr


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 09-03-2007 à 20:40:11    

tr c'est pour des caractère il me semble... pas pour des chaînes de caractères..

Reply

Marsh Posté le 13-03-2007 à 13:04:40    

tuton01 a écrit :

tr c'est pour des caractère il me semble... pas pour des chaînes de caractères..


 
Voir avec la commande SED:
avec quelques exemples perso:
 
Syntaxe sed pour remplacer une chaine de caractere dans un fichier.
Ici recherche la ligne commencant par "#m1" et la remplace par "m1":

sed s/^#m1/m1/ inittab


Et inversement:

sed s/^m1/#m1/ inittab.server


 
Remplace la valeur chaine derrière IPADDR= par la valeur de la variable $IP et renvoi dans le fichier d'origine.

sed "s/\(IPADDR=\).*$/\1$IP/" /root/ifcfg-eth0.bak > /etc/sysconfig/network-scripts/ifcfg-eth0


Supprime toutes les lignes contenant "local3.info" du fichier test

sed /local3.info/d test


 
Conversion fichier assembleur TASM (windows) en fichier TPASM (linux).
 
include nomfichier ou .include nomfichier => include "nomfichier"
#define ROUTINE => ROUTINE equ 1
#ifdef => ifdef
#endif => endif
label equ Px.y => label equ Px_y
 

sed 's/^[ ]*#define[ ]*\(.*\)$/\1 equ 1/' $tasm_file | \
sed 's/^[ .]*include[ ]*\(.*\)$/ include "\1"/' | \
sed 's/#ifdef/ifdef/' | \
sed 's/#endif/endif/' | \
sed 's/^\(.*\)\.\([0-9].*\)$/\1_\2/' > $tpasm_file

Reply

Marsh Posté le 21-03-2007 à 21:34:50    

Je vais essayer d'apprendre mieux à me servir de Sed.. On verra si j'y arrive avec.
Merci en tout cas.

Reply

Marsh Posté le 21-03-2007 à 22:17:34    

Génialissime Sed !! Merci pour les exemples..


Message édité par tuton01 le 21-03-2007 à 22:17:55
Reply

Marsh Posté le 22-03-2007 à 08:54:02    

Ou sinon, tu peux aussi faire ça avec perl, la syntax est sensiblement la même que sed, mais je trouve que c'est plus simple à utiliser :)


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed