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

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: