Najprostszy sposób na komentowanie / odkomentowanie niektórych linii za pomocą wiersza poleceń

37

Czy istnieje sposób na komentowanie / odkomentowanie skryptu powłoki / config / ruby ​​za pomocą wiersza poleceń?

na przykład:

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

spowoduje to dodanie lub usunięcie #wpisu bla.confw trybie online 14do 18. Zwykle używam sed, ale muszę znać zawartość tych wierszy, a następnie wykonać operację znajdowania-zamiany, co dałoby zły wynik, gdy istnieje więcej niż jedna igła (a my chcemy tylko wymienić N-ty jeden).

Kokizzu
źródło
1
Jest A do tego Q pt odkomentowanie wiele linii kodu, określona przez numery linii, za pomocą vi lub vim , który pokazuje wiele metod robi to za pomocą sed, perlitd konkretnie A przez terdon!
slm

Odpowiedzi:

46

Aby skomentować linie od 2 do 4 bla.conf:

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

Aby wykonać polecenie, które chcesz, po prostu umieść powyższe w skrypcie powłoki o nazwie komentarz:

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

Ten skrypt jest używany tak samo jak twój, z tym wyjątkiem, że pierwszy i ostatni wiersz należy oddzielić przecinkiem, a nie myślnikiem. Na przykład:

comment 2,4 bla.conf

Polecenie odkomentowania można utworzyć analogicznie.

Zaawansowana funkcja

sedWybór linii jest dość potężny. Oprócz określenia pierwszego i ostatniego wiersza według numeru, można również określić je za pomocą wyrażenia regularnego. Tak więc, jeśli chcesz sterować wszystkimi liniami od tego zawierającego foodo tego zawierającego bar, użyj:

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

Systemy BSD (OSX)

W przypadku BSD sed -iopcja wymaga argumentu, nawet jeśli jest to tylko pusty ciąg. Dlatego na przykład zamień górne polecenie powyżej na:

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

I zamień polecenie w skrypcie na:

sed -i '' "$1"' s/^/#/' "$2"
John1024
źródło
1
Czy podwójne 'po -iopcji jest zamierzone? Nie potrzebowałem ich.
raphinesse
8

Z GNU sed (aby zastąpić pliki na miejscu -iopcją):

sed -i '14,18 s/^/#/' bla.conf
sed -i '14,18 s/^##*//' bla.conf
Gilles „SO- przestań być zły”
źródło
2

Możesz używać Vima w trybie Ex:

ex -sc 'g/^\s*[^#]/s/^/#/' -cx bla.conf
ex -sc 'g/^\s*#/s/#//' -cx bla.conf
  1. g regex globalny

  2. s zastąpić

  3. x Zapisz i zamknij

Steven Penny
źródło
2

Możesz utworzyć plik bash z funkcjami, aby użyć go ponownie w swoich projektach

#!/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
źródło