it-swarm.com.de

Suchen und ersetzen Sie mit sed, wenn Punkte und Unterstriche vorhanden sind

Wie ersetze ich foo? mit foo_ mit sed einfach laufen

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

funktioniert nicht . Danke!

19

Entkomme dem .:

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

Beispiel:

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

Interessanterweise müssen Sie den Punkt in einen Zeichensatz setzen, wenn Sie nur nach dem Punkt suchen und ihn ersetzen möchten. Es ist nicht möglich, nur den Punkt in einem sed-Befehl aus einem bestimmten Grund zu umgehen. Der Punkt wird immer noch zu einem Platzhalter für ein einzelnes Zeichen erweitert.

$ bash --version  # Ubuntu Lucid (10.04)

GNU bash, Version 4.1.5 (1) -freigabe (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

Mit der Hinzufügung von führenden Zeichen in der Suche funktioniert das Escape. 

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

foo_

Das Setzen des Punktes in einen Zeichensatz funktioniert natürlich auch.

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

foo_

- Paul

9
Paul S

Entfliehen Sie dem Punkt mit einem \

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

Wenn Sie die Kombination aus/und\verwirrend finden, können Sie ein anderes Trennzeichen verwenden

sed 's#foo\.#foo_#g

Das zweite Zeichen nach dem s kann alles sein und sed wird dieses Zeichen als Trennzeichen verwenden.

6
sashang

Sie müssen dem Punkt entkommen - ein nicht abgelegter Punkt passt zu jedem Zeichen nach foo.

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

Für mich arbeitet sed 's/foo\./foo_/g'. Sie können aber auch versuchen: 

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

und

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

und

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