web-dev-qa-db-fra.com

Rechercher et remplacer par sed lorsque des points et des traits de soulignement sont présents

Comment puis-je remplacer foo. avec foo_ avec sed simplement en cours d'exécution

sed 's/foo./foo_/g' file.php

ne fonctionne pas . Merci!

19
algorithmicCoder

Échapper au .:

sed 's/foo\./foo_/g' file.php

Exemple:

~$ cat test.txt 
foo.bar
~$ sed 's/foo\./foo_/g' test.txt 
foo_bar
22
rid

Fait intéressant, si vous souhaitez rechercher et remplacer uniquement le point, vous devez le placer dans un jeu de caractères. Échapper au point seul dans une commande sed pour une raison quelconque ne fonctionne pas. Le point est toujours étendu à un caractère générique à caractère unique.

$ bash --version  # Ubuntu Lucid (10.04)

GNU bash, version 4.1.5 (1) - release (x86_64-pc-linux-gnu)

$ echo aa.bb.cc | sed s/\./-/g  # replaces all characters with dash

'--------'

$ echo aa.bb.cc | sed s/[.]/-/g  # replaces the dots with a dash

aa-bb-cc

Avec l'ajout de personnages principaux dans la recherche, l'évasion fonctionne. 

$ echo foo. | sed s/foo\./foo_/g  # works

foo_

Mettre le point dans un jeu de caractères fonctionne bien sûr également.

$ echo foo. | sed s/foo[.]/foo_/g  # also works

foo_

--Paul

9
Paul S

Échapper au point avec un \

sed 's/foo\./foo_/g' file.php

Si vous trouvez la combinaison de/et\déroutante, vous pouvez utiliser un autre caractère 'séparateur'

sed 's#foo\.#foo_#g

Le deuxième caractère après le s peut être n'importe quoi et sed utilisera ce caractère comme séparateur.

6
sashang

Vous devez échapper au point - un point non échappé correspondra à tout caractère après foo.

sed 's/foo\./foo_/g'
3
August Karlstrom

Pour moi, sed 's/foo\./foo_/g' fonctionne. Mais vous pouvez aussi essayer: 

sed -e 's/foo\./foo_/g'

et

sed -e "s/foo\\./foo_/g"

et

sed 's/foo[.]/foo_/g'
0
jfg956