OVH Cloud OVH Cloud

sed, remplacement de mots entiers

4 réponses
Avatar
Le Gaulois
Bonjour,

existe-t-il une option de la commande s pour ne faire le remplacement
que dans le cas d'un mot entier ?

s/machin/bidule/g seulement si "machin" est un mot entier

4 réponses

Avatar
Thomas vO
bonjour,

À (at) Mon, 14 Nov 2005 11:20:29 +0100,
Le Gaulois nous disait (told us):
Bonjour,

existe-t-il une option de la commande s pour ne faire le
remplacement que dans le cas d'un mot entier ?

s/machin/bidule/g seulement si "machin" est un mot entier


un mot entier = avec une espace après ? à ce moment :
sed s/machin /bidule /g

--
Thomas vO - <http://perso.enstimac.fr/~vanouden/>

Avatar
Marc Boyer
Le 14-11-2005, Le Gaulois a écrit :
existe-t-il une option de la commande s pour ne faire le remplacement
que dans le cas d'un mot entier ?

s/machin/bidule/g seulement si "machin" est un mot entier


Pas de manière portable et simple à ma connaissance,
mais les outils manipulant des expressions regulières
proposent souvent des extensions à base de délimiteur
< et >.
Sur ma machine Linux, la page de man de sed renvoit
sur celle de regex(7), qui dit

There are two special cases(!) of bracket expressions: the bracket
expressions `[[:<:]]' and `[[:>:]]' match the null string at the
beginning and end of a word respectively. A word is defined as a
sequence of word characters which is neither preceded nor followed by
word characters. A word character is an alnum character (as
defined by wctype(3)) or an underscore. This is an extension,
compatible with but not specified by POSIX 1003.2, and should be used
with caution in software intended to be portable to other systems.

Marc Boyer
--
À vélo, prendre une rue à contre-sens est moins dangereux
que prendre un boulevard dans le sens légal. À qui la faute ?

Avatar
TiChou
Dans le message <news:,
*Le Gaulois* tapota sur f.c.o.unix :

Bonjour,


Bonjour,

existe-t-il une option de la commande s pour ne faire le remplacement
que dans le cas d'un mot entier ?


D'une manière simple, je ne pense pas.

s/machin/bidule/g seulement si "machin" est un mot entier


Une solution alternative est d'utiliser perl où les expressions rationnelles
permettent de faire beaucoup plus que les expressions rationnelles
classiques.
Par exemple, il existe l'ancre b qui permet dans une expression de séparer
les mots. Par exemple :

$ echo 'machine machinerie' | perl -p -e 's/bmachineb/bidule/g'
bidule machinerie

--
TiChou

Avatar
Stephane Chazelas
On Mon, 14 Nov 2005 11:20:29 +0100, Le Gaulois wrote:
Bonjour,

existe-t-il une option de la commande s pour ne faire le remplacement
que dans le cas d'un mot entier ?

s/machin/bidule/g seulement si "machin" est un mot entier


quelquechose comme:

s/ / /g
s/.*/ & /
s/ machin / bidule /g
s/ //
s/ $//
s/ / /g

Si par mot tu entends ce qui est delimité par des espaces.

--
Stephane