it-swarm.com.de

sed - Kommentiert eine Zeile, die mit einer bestimmten Zeichenfolge UND korrespondiert, die noch nicht auskommentiert ist

Ich habe die folgende Testdatei

AAA
BBB
CCC

Mit dem folgenden sed kann ich die ZeileBBBauskommentieren.

# sed -e '/BBB/s/^/#/g' -i file

Ich möchte die Zeile nur auskommentieren, wenn am Anfang noch kein # steht.

# sed -e '/^#/! /BBB/s/^/#/g' file

sed: -e expression #1, char 7: unknown command: `/'

Irgendwelche Ideen, wie ich das erreichen kann?

Angenommen, Sie haben keine Zeilen mit mehreren #s, würde dies funktionieren:

sed -e '/BBB/ s/^#*/#/' -i file

Hinweis: Sie benötigen/g nicht, da Sie höchstens eine Ersetzung pro Zeile vornehmen.

70
aragaer

Ich finde diese Lösung, um am besten zu funktionieren.

sed -i '/![^#]/ s/\(^.*BBB.*$\)/#\ \1/' file

Es spielt keine Rolle, wie viele "#" -Symbole es gibt, es wird niemals ein weiteres hinzugefügt. Wenn das gesuchte Muster kein "#" enthält, wird es an den Anfang der Zeile angehängt und außerdem ein Leerzeichen hinzugefügt.

Wenn Sie kein Leerzeichen wünschen

sed -i '/![^#]/ s/\(^.*BBB.*$\)/#\1/' file

Eine andere Lösung mit dem Sonderzeichen &, das auf den gesamten übereinstimmenden Teil des Musterbereichs verweist. Es ist etwas einfacher/sauberer als das Erfassen und Referenzieren einer Regex-Gruppe.

sed -i 's/^[^#]*BBB/#&/' file
2
agostonbarna

sed -i '/![^#]/ s/\(^.*BBB.*$\)/#\ \1/' file

Dies funktioniert bei mir nicht mit dem Schlüsselwort *.Sudo, überhaupt keine Kommentare ...

Nur die folgende Syntax funktioniert: sed -e '/Sudo/ s/^#*/#/' file

1
Bill

Tatsächlich benötigen Sie kein Ausrufezeichen (!), Da das Caret-Symbol bereits das negiert, was sich in den eckigen Klammern befindet, und alle Hash-Symbole bei Ihrer Suche ignoriert. Dieses Beispiel hat für mich funktioniert:

sed -i '/[^#]/ s/\(^.*BBB.*$\)/#\ \1/' file

0
Dwayne Mcnab