Einfachste Möglichkeit, bestimmte Zeilen über die Befehlszeile zu kommentieren oder zu kommentieren

37

Gibt es eine Möglichkeit, ein Shell- / Konfigurations- / Ruby-Skript über die Befehlszeile zu kommentieren / zu kommentieren?

zum Beispiel:

$ comment 14-18 bla.conf
$ uncomment 14-18 bla.conf

Dies würde hinzufügen oder entfernen #anmelden bla.confonline 14zu 18. Normalerweise benutze ich sed, aber ich muss den Inhalt dieser Zeilen kennen und dann eine Find-Replace-Operation ausführen, und das würde zu einem falschen Ergebnis führen, wenn es mehr als eine Nadel gibt (und wir wollen nur die N-te ersetzen eins).

Kokizzu
quelle
1
Es gibt eine A diese Q betitelt: uncommenting mehrere Code - Zeilen, die von Zeilennummern angegeben, mit vi oder vim , die zeigt , viele Methoden , dies zu tun mit sed, perletc. Insbesondere die A von terdon!
slm

Antworten:

46

So kommentieren Sie die Zeilen 2 bis 4 von bla.conf:

sed -i '2,4 s/^/#/' bla.conf

Um den gewünschten Befehl zu erstellen, fügen Sie den obigen Befehl einfach in ein Shell-Skript mit dem Namen comment ein:

#!/bin/sh
sed -i "$1"' s/^/#/' "$2"

Dieses Skript wird genauso wie Ihr Skript verwendet, mit der Ausnahme, dass die erste und die letzte Zeile durch ein Komma und nicht durch einen Bindestrich getrennt werden sollen. Beispielsweise:

comment 2,4 bla.conf

Ein Kommentarbefehl kann analog erstellt werden.

Erweiterte Funktion

sedDie Zeilenauswahl ist ziemlich mächtig. Neben der Angabe der ersten und letzten Zeile nach Nummer können diese auch durch einen regulären Ausdruck angegeben werden. Wenn Sie also alle Zeilen von der einen mit foobis zur anderen mit befehlen möchten bar, verwenden Sie:

comment '/foo/,/bar/' bla.conf

BSD (OSX) Systeme

Bei BSD sed -ibenötigt die Option ein Argument, auch wenn es sich nur um eine leere Zeichenfolge handelt. Ersetzen Sie daher zum Beispiel den obigen Befehl top durch:

sed -i '' '2,4 s/^/#/' bla.conf

Und ersetzen Sie den Befehl im Skript durch:

sed -i '' "$1"' s/^/#/' "$2"
John1024
quelle
1
Sind die Doppel 'nach der -iOption beabsichtigt? Brauchte sie nicht
Raffinesse
8

Mit GNU sed (um die vorhandenen Dateien durch die -iOption zu ersetzen ):

sed -i '14,18 s/^/#/' bla.conf
sed -i '14,18 s/^##*//' bla.conf
Gilles 'SO - hör auf böse zu sein'
quelle
2

Sie können Vim im Ex-Modus verwenden:

ex -sc 'g/^\s*[^#]/s/^/#/' -cx bla.conf
ex -sc 'g/^\s*#/s/#//' -cx bla.conf
  1. g globaler regulärer Ausdruck

  2. s Ersatz

  3. x speichern und schließen

Steven Penny
quelle
2

Sie können eine bash_file mit Funktionen erstellen, um sie in Ihren Projekten wiederzuverwenden

#!/bin/bash

# your target file
CONFIG=./config.txt

# comment target
comment() {
  sed -i '' "s/^$1/#$1/" $CONFIG
}

# comment target
uncomment() {
  echo $1
  sed -i '' "s/^#$1/$1/" $CONFIG
}


# Use it so:
uncomment enable_uart
comment arm_freq
Jan
quelle