Re: [SHELL] remplacer un caractère dans une sous-chaine
Sylvain Sauvage a écrit, jeudi 20 décembre 2007, à 16:30 :
[...]
> Pour sed, les adresses ne fonctionnent que sur plusieurs
> lignes.
Oui,
> En revanche, la négation :
>
> > /\([^Dd]...\|[dD]\([^a]..\|a\([^t].\|t[^e]\)\)\)\[/,/\]/y/ /_/
On peut tourner la chose autrement : Sed connaît la négation /motif/!,
et on peut emboîter des blocs entre accolades.
> Mais ça devient très lourd à gérer avec sed. Il vaudrait
> vraiment passer à un vrai langage (Ruby, Perl???).
Sed est Turing-complet, mécréant !
> Pour me pardonner d???avoir dit une ânerie :
> #!/usr/bin/ruby
Pfff. Sed peut aisément
1/ Isoler les motifs à traiter entre deux lignes debut, fin :
sed -e 's/\([a-z]\+\[[^]]*\])/BALISE_debut\n\1\nBALISE_fin\n/ig'
2/ Traiter uniquement les susdits motifs :
sed -e '/BALISE_debut$/,/^BALISE_fin$/{# Dans le bloc,
/BALISE_/!{# ne pas traiter les bornes,
/^\(truc\|machin\)/!{# ni ces motifs.
s/[[:space:]]/_/g # traitement...
}
}
}'
3/ Recoller les morceaux... (en exercice :)
--
Jacques L'helgoualc'h
Reply to: