Ich habe die folgende Testdatei
AAA
BBB
CCC
Mit dem folgenden sed kann ich die BBB- Zeile auskommentieren .
# sed -e '/BBB/s/^/#/g' -i file
Ich möchte die Zeile nur auskommentieren, wenn sie am Anfang noch kein # hat.
# sed -e '/^#/! /BBB/s/^/#/g' file
sed: -e expression #1, char 7: unknown command: `/'
Irgendwelche Ideen, wie ich das erreichen kann?
#
Sekunden nach diesem Befehl begann, wird es "bereinigt", um nur mit einem zu beginnen#
. Um dieses Problem zu beheben, wenn es ein Problem ist, ändern Sie einfach das passende Teil entsprechend (z. B.sed -e '/^BBB/
...)sed '/^#BBB/'
was meinen Sie. Aber wenn BBB irgendwo in der Mitte ist, wird es nicht funktionieren. Es gibt eine Option zum Schreiben,sed '/^#/! {/BBB/ s/^/#/}'
die viel besser funktioniert, aber meine anfängliche Lösung ist viel einfacher, solange Sie die Einschränkung kennen.sed -e '/BBB/ s|^(//)*|//|' -i file
. Beachten Sie, dass es nur für einzelne artige Kommentare funktioniert, geht davon aus, dass der Kommentar beginnt am Anfang der Zeile und mehrere ersetzen Paare von//
mit einem einzigen//
.Ich finde, dass diese Lösung am besten funktioniert.
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 am Zeilenanfang und ein nachfolgendes Leerzeichen hinzugefügt.
Wenn Sie keinen nachgestellten Leerzeichen möchten
sed -i '/^[^#]/ s/\(^.*BBB.*$\)/#\1/' file
quelle
Eine andere Lösung mit dem
&
Sonderzeichen, das auf den gesamten übereinstimmenden Teil des Musterraums verweist. Es ist ein bisschen einfacher / sauberer als das Erfassen und Referenzieren einer regulären Ausdrucksgruppe.sed -i 's/^[^#]*BBB/#&/' file
quelle
sed -i '/![^#]/ s/\(^.*BBB.*$\)/#\ \1/' file
Dies funktioniert bei mir mit dem Schlüsselwort nicht
*.sudo
, überhaupt keine Kommentare ...Nur die folgende Syntax funktioniert:
sed -e '/sudo/ s/^#*/#/' file
quelle
Angenommen, die BBB steht am Anfang einer Zeile, habe ich einen noch einfacheren Ausdruck verwendet:
sed -e '/^BBB/s/^/#/' -i file
Noch eine Anmerkung für die Zukunft mir. Übersehen Sie nicht die
-i
. Weil das nicht funktioniert :sed -e "..." same_file > same_file
.quelle
Tatsächlich benötigen Sie das Ausrufezeichen (!) Nicht, da das Caret-Symbol bereits alles negiert, was sich in den eckigen Klammern befindet, und alle Hash-Symbole bei Ihrer Suche ignoriert. Dieses Beispiel hat bei mir funktioniert:
sed -i '/[^#]/ s/\(^.*BBB.*$\)/#\ \1/' file
quelle
Ich würde in der Regel liefern
sed
mit-i.bak
Backup der Datei , bevor Sie Änderungen an der Originalkopie:sed -i.bak '/BBB/ s/^#*/#/' file
Auf diese Weise habe ich beides
file
undfile.bak
kann mich entscheiden, esfile.bak
erst zu löschen , wenn ich mir sicher bin.quelle