[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: