Re: [SHELL] remplacer un caractère dans une sous-chaine
Jacques L'helgoualc'h, jeudi 20 décembre 2007, 22:05:14 CET
>[…]
> > 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/!,
Ah oui, tiens. On ne lit jamais assez bien les docs.
> 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 !
Argument facile : c’est une chose d’avoir une machine de
Turing, c’en est une autre d’écrire des programmes utiles avec.
Pour rappel, la démonstration consiste à simuler une machine
à un processeur avec un seul registre et deux instructions.
Ensuite, on utilise le résultat d’autres démonstrations de
simulation : équivalence de cette machine avec une machine à
plusieurs registres, plusieurs rubans… jusqu’à démontrer qu’on
peut s’en servir pour simuler un langage de haut niveau.
Autant directement utiliser un tel langage.
> > Pour me pardonner d???avoir dit une ânerie :
>
> > #!/usr/bin/ruby
>
> Pfff. Sed peut aisément
… mais pas très lisiblement
> 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...
> }
> }
> }'
Gestion des [] imbriqués ? :oP
> 3/ Recoller les morceaux... (en exercice :)
Ah, ah, la technique habituelle des profs quand ça devient
scabreux : « en exercice », « c’est trivial »…
Je préfère le « vous verrez ça l’année prochaine » :o)
--
Sylvain Sauvage
Reply to: