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.
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
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
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