Cara paling sederhana untuk mengomentari / menghapus tanda komentar pada baris tertentu menggunakan baris perintah

37

Apakah ada cara untuk mengomentari / menghapus komentar skrip shell / config / ruby ​​menggunakan baris perintah?

sebagai contoh:

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

ini akan menambah atau menghapus #tanda on bla.confon line 14ke 18. Biasanya saya gunakan sed, tapi saya harus tahu isi dari garis-garis itu dan kemudian melakukan operasi find-replace, dan itu akan memberikan hasil yang salah ketika ada lebih dari satu jarum (dan kami hanya ingin mengganti N-th satu).

Kokizzu
sumber
1
Ada A ke Q ini berjudul: beberapa baris uncommenting kode, yang ditentukan oleh nomor baris, menggunakan vi atau vim yang menunjukkan banyak metode untuk melakukan hal ini menggunakan sed, perl, dll Secara khusus A dengan Terdon!
slm

Jawaban:

46

Untuk mengomentari baris 2 hingga 4 dari bla.conf:

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

Untuk membuat perintah yang Anda inginkan, cukup masukkan perintah di atas ke dalam shell script bernama comment:

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

Script ini digunakan sama seperti milik Anda dengan pengecualian bahwa baris pertama dan terakhir harus dipisahkan oleh koma daripada tanda hubung. Sebagai contoh:

comment 2,4 bla.conf

Perintah tanda komentar dapat dibuat secara analog.

Fitur lanjutan

sedPilihan jalur cukup kuat. Selain menentukan baris pertama dan terakhir berdasarkan nomor, juga dimungkinkan untuk menentukannya dengan regex. Jadi, jika Anda ingin memerintahkan semua baris dari baris yang berisi foobaris yang berisi bar, gunakan:

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

Sistem BSD (OSX)

Dengan sed BSD, -iopsi membutuhkan argumen bahkan jika itu hanya string kosong. Jadi, misalnya, ganti perintah teratas di atas dengan:

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

Dan, ganti perintah dalam skrip dengan:

sed -i '' "$1"' s/^/#/' "$2"
John1024
sumber
1
Apakah dobel 'setelah -iopsi disengaja? Tidak membutuhkannya.
raphinesse
8

Dengan GNU sed (untuk mengganti file yang ada dengan -iopsi):

sed -i '14,18 s/^/#/' bla.conf
sed -i '14,18 s/^##*//' bla.conf
Gilles 'SANGAT berhenti menjadi jahat'
sumber
2

Anda dapat menggunakan Vim dalam mode Ex:

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

  2. s pengganti

  3. x Simpan dan tutup

Steven Penny
sumber
2

Anda dapat membuat bash_file dengan fungsi untuk menggunakannya kembali di proyek Anda

#!/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
sumber