sed recherche et remplacement de mot entier


120

Comment rechercher et remplacer des mots entiers en utilisant sed?

Faire

sed -i 's/[oldtext]/[newtext]/g' <file> 

remplacera également les correspondances partielles [oldtext]dont je ne veux pas qu'il le fasse.

Réponses:


164

\ b dans les expressions régulières correspond aux limites des mots (c'est-à-dire l'emplacement entre le premier caractère de mot et le caractère non-mot):

$ echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
no bar embarassment


@OlegMazko Je suis également venu à la recherche de la méthode posix acceptable à utiliser dans vim et ce qui a fonctionné pour moi était s / \ <7 // g. J'essayais de supprimer un 7 au début d'un mot dans mon code. Ce lien, en particulier la solution de JP, m'a conduit à la réponse: stackoverflow.com/questions/3864467/… (impossible d'obtenir une démarque pour l'intégrer comme la vôtre pour une raison quelconque).
— jimh

Merci, je devenais fou en essayant de faire un remplacement sur le mot "et" donc \band\bsauvé la journée :)
— MitchellK

145

Sur Mac OS X, aucune de ces syntaxes regex ne fonctionne dans sed pour faire correspondre des mots entiers

  • \bmyWord\b
  • \<myWord\>

Écoutez-moi maintenant et croyez-moi plus tard, cette vilaine syntaxe est ce que vous devez utiliser:

  • /[[:<:]]myWord[[:>:]]/

Ainsi, par exemple, pour remplacer menthe par menthe pour les mots entiers uniquement:

  • sed "s/[[:<:]]mint[[:>:]]/minty/g"

Source: page de manuel re_format


19
Installez simplement GNU sed(et tous les autres outils GNU) via MacPorts ou Homebrew et assurez-vous qu'il vient en premier dans votre PATH. Il est possible de rendre un Mac assez utilisable.
— Jim Stewart

9
@JimStewart est un excellent moyen de briser un tas d'outils qui supposent que `` sous OS X, faites comme les OS Xers ''. Cela dit, je peux certainement suggérer brew install coreutils, qui préfixe tous les outils gnu.
— ELLIOTTCABLE

16
brew install gnu-sedà utilisergsed
— k107

brasser coreutils est génial. y a-t-il d'autres packages de brassage qui installent tout un tas de versions gnu de commandes ou dois-je installer le reste individuellement?
— ckot

2
L' utilisation de Perl est toujours une meilleure solution: perl -pe 's|\bone\b|two|g'. Fonctionne de manière stable tandis que sed échoue ici et là.
— Pavel Vlasov

13

Utiliser \bpour les limites de mots:

sed -i 's/\boldtext\b/newtext/g' <file>

3
Soyez prudent avec []: o,l-> [newtext],[newtext]. Vous sed -i 's/\boldtext\b/newtext/g'
— vouliez

7

Dans l'une de mes machines, délimiter le mot par " \b" (sans les guillemets) ne fonctionnait pas. La solution consistait à utiliser " \<" pour commencer le délimiteur et "\> " pour le délimiteur de fin.

Pour expliquer avec l'exemple de Joakim Lundberg :

$ echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
no bar embarassment

2

dans la commande shell:

echo "bar embarassment" | sed "s/\bbar\b/no bar/g" 

ou:

echo "bar embarassment" | sed "s/\<bar\>/no bar/g"

mais si vous êtes dans vim, vous ne pouvez utiliser que le plus tard:

:% s/\<old\>/new/g

-1
$ echo "bar embarassment"|awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1'
no bar embarassment

OP déclare explicitement "using sed"
— ndemou

Il s'agit d'une jointure de manipulation fractionnée, pas d'un remplacement pur; cela réduit plusieurs espaces en un seul et supprime tous les espaces de début / de fin: par exemple, echo " bar embarassment " | awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1' | cat -Edonne no bar embarassment$.
— musiphil
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.