it-swarm.com.de

Wie kann ich mit Sed eine Zeile UNCOMMENTIEREN, die einen bestimmten String enthält?

Die Zeilen in der Datei:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 2000 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2001 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2002 -j ACCEPT

zum Auskommentieren sagen wir die Zeile, die enthält

2001

ich kann einfach diesen SED-Befehl ausführen:

sed -i '/ 2001 /s/^/#/' file

aber wie kann ich jetzt zurückkehren?

wie im unkommentar die selbe zeile?

ich habe es versucht

sed -i '/ 2001 /s/^//' file

das funktioniert nicht.

42
user3864928

Versuchen Sie diesen sed Befehl,

sed -i '/^#.* 2001 /s/^#//' file
46
Avinash Raj

Ja, um eine Zeile mit einer bestimmten Zeichenfolge mit sed zu kommentieren, gehen Sie einfach wie folgt vor:

sed -i '/<pattern>/s/^/#/g' file

Und um es zu kommentieren:

sed -i '/<pattern>/s/^#//g' file

In Ihrem Fall:

sed -i '/2001/s/^/#/g' file    (to comment out)
sed -i '/2001/s/^#//g' file    (to uncomment)

Option "g" am Ende bedeutet globale Änderung. Wenn Sie nur eine einzelne Instanz des Musters ändern möchten, überspringen Sie dies einfach.

75
JNLK

Um @ Avinash Rajs hilfreiche Antwort mit einer allgemeineren , POSIX-kompatiblen Lösung zu ergänzen.

  • Toggles Kommentieren von Zeilen , die mit einem spezifizierbaren String übereinstimmen, der vorkommen muss als separates Wort irgendwo in der Zeile.
  • Das Kommentarzeichen (String) ist ebenfalls vorgebbar .

Beachten Sie, dass die Lösung awk- basiert , da eine robuste portable Lösung mit sed praktisch unmöglich ist aufgrund der Einschränkungen von POSIX ' basic reguläre Ausdrücke.

awk -v commentId='#' -v Word='2001' '
  $0 ~ "(^|[[:punct:][:space:]])" Word "($|[[:punct:][:space:]])" { 
    if (match($0, "^[[:space:]]*" commentId))
      $0 = substr($0, RSTART + RLENGTH)
    else
      $0 = commentId $0
  } 
  { print }
  ' file > tmpfile.$$ && mv tmpfile.$$ file
  • (^|[[:punct:][:space:]]) und ($|[[:punct:][:space:]]) sind die POSIX-Äquivalente des erweiterten regulären Ausdrucks von \< und \> Aus anderen Regex-Dialekten bekannte Wortgrenzenbehauptungen.
  • Leerzeichen after das Kommentarzeichen bleibt erhalten, jedoch nicht davor.
  • Wenn Sie das Kommentarzeichen einer Zeile voranstellen, wird es direkt ohne Leerzeichen vorangestellt.
  • Wenn Sie Kommentare nur mit this solution umschalten, bleiben alle Leerzeichen erhalten.
  • POSIX awk bietet keine direkte Aktualisierung (übrigens auch nicht POSIX sed), daher wird die Ausgabe zuerst in einer temporären Datei erfasst und diese Datei ersetzt dann bei Erfolg das Original.
6
mklement0

Bei einem Mac, der keine Standard-Sed-Parameter unterstützt, wird das Hashtag entfernt

sed -i "" "/.*#.*d\/docker-php-ext-xdebug\.ini.*/s/^#//g" docker-compose.yml
0
max4ever

Ein kurzes Beispiel für das Kommentieren und Kommentieren einer Zeile in einer Datei.

Beispieldatei:

umask 027
TMOUT=600

Lass uns jetzt die Datei sichern (nur zum Lachen) und auskommentieren und kommentieren:

# backup file (because we should always do this)
cp /etc/bash.bashrc /etc/bash.bashrc.$(date '+%Y-%m-%d,%H:%M:%S')

# original: TMOUT=600   , result :# TMOUT=600
sed -i '/[^#]/ s/\(^TMOUT=600.*$\)/#\ \1/' /etc/bash.bashrc

# original # TMOUT=600   ,result :TMOUT=600
sed -i '/^#.*TMOUT=600.*$/s/^#\ //' /etc/bash.bashrc
0
Mike Q