ubuntuusers.de

sed - exakt suchen und ersetzen

Status: Gelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

Nur-Ein-Blogger

Anmeldungsdatum:
4. April 2011

Beiträge: 146

Hallo, ich nochmal.

Ich habe mit sed jetzt etwas experimentiert und für ein Vorhaben habe ich diesen Code:

1
sed -i "/OPEN_TCP=\"/ s//&$FTP_PORT,/" /root/firewall.conf

Alternativ diesen:

1
sed -i "s/OPEN_TCP=\"/OPEN_TCP=\"$FTP_PORT,/g" /root/firewall.conf

Nun habe ich aber das Problem, dass in der File z.b. auch das vorkommt:

  • LAN_OPEN_TCP=""

  • LAN_HOST_OPEN_TCP=""

  • LAN_INET_OPEN_TCP=""

etc.

OPEN_TCP ist das letzte "OPEN_TCP" welches im Dokument vorkommt.

Mein obiger Code macht aber das aus den Zeilen

  • LAN_OPEN_TCP="22,"

  • LAN_HOST_OPEN_TCP="22,"

  • LAN_INET_OPEN_TCP="22,"

Das möchte ich aber nicht. Jemand eine Idee, wie man das bewerkstelligen kann?

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Hallo!

Nur kurz überflogen, aber ich vermute du solltest sed noch mal lesen. Das /g hintenan heißt global und ersetzt alle Vorkommen, nicht nur eines.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11269

Wohnort: München

Mit dem Caret Zeichen (^) kannst du auf den Zeilenanfang matchen - also z.B.:

1
sed -i "/^OPEN_TCP=\"/ s//&$FTP_PORT,/" /root/firewall.conf

Dann würde er OPEN_TCP nur finden, wenn es am Anfang der Zeile steht.

Nur-Ein-Blogger

(Themenstarter)

Anmeldungsdatum:
4. April 2011

Beiträge: 146

Naja, das habe ich gelesen, ich ging davon aus, dass er dann halt das ganze Dokument durchsucht.

Ich fand in der Doku aber keine Hinweise darauf, wie ich nur und exakt den Wortlaut ersetzen kann.

Also das die Zeile so anfangen muss, ohne vorher etwas anders.

@seahawk1986 danke, das war es.

Aber gäbe es auch eine andere Möglichkeit? Ich mag ja dazu lernen und interessant wäre es, wenn es nicht der Anfang der Zeile wäre.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11269

Wohnort: München

Nur-Ein-Blogger schrieb:

Aber gäbe es auch eine andere Möglichkeit? Ich mag ja dazu lernen und interessant wäre es, wenn es nicht der Anfang der Zeile wäre.

Du könntest alternativ eine oder mehrere Wortgrenzen nutzen (vgl. https://stackoverflow.com/questions/1032023/sed-whole-word-search-and-replace) - also z.B.:

1
sed 's/\bOPEN_TCP=\"/&22/' /root/firewall.conf

MisterIgo

Anmeldungsdatum:
23. April 2009

Beiträge: 947

ChickenLipsRfun2eat schrieb: Das /g hintenan heißt global und ersetzt alle Vorkommen, nicht nur eines.

Das bezieht sich auf die Zeile:

% echo "blablabla" | sed 's/a/d/'
bldblabla
% echo "blablabla" | sed 's/a/d/g'
bldbldbld

Nur-Ein-Blogger schrieb:

Aber gäbe es auch eine andere Möglichkeit? Ich mag ja dazu lernen und interessant wäre es, wenn es nicht der Anfang der Zeile wäre.

Du kannst außer der Lösung von seahawk1996 auch gezielt nach Zeichen matchen, die es nicht sein dürfen. Also in deinem Fall der Unterstrich:

% echo "_OPEN_TCP" | sed 's/[^_]OPEN_TCP/foo/' 
_OPEN_TCP
% echo " OPEN_TCP" | sed 's/[^_]OPEN_TCP/foo/' 
foo

Das matcht dann allerdings nicht den Zeilenanfang, sondern ein beliebiges Zeichen außer '_'.

Antworten |