Saya punya file dengan komentar:
foo
bar
stuff
#Do not show this...
morestuff
evenmorestuff#Or this
Saya hanya ingin mencetak semua kode tanpa komentar:
foo
bar
stuff
morestuff
evenmorestuff
Mampu menghapus komentar dari file sangat penting ... Apa cara yang baik untuk melakukannya?
shell-script
text-processing
awk
sed
grep
Tanda tanya
sumber
sumber
awk -F\# '$1!="" { print $1 ;} '
.echo '#' # output a #
akan ditangani?Jawaban:
Salah satu cara untuk menghapus semua komentar adalah dengan menggunakan
grep
dengan-o
pilihan:dimana
-o
: cetakan hanya cocok dengan bagian dari garis^
: awal baris[^#]*
: karakter apa pun kecuali yang#
berulang nol atau lebihPerhatikan bahwa garis kosong juga akan dihapus, tetapi garis dengan hanya spasi akan tetap ada.
sumber
grep -v '^#' file > newfilewithoutcomments
somvar='I am a long complicated string ## with special characters' # and I am a comment
tidak akan ditangani dengan benar.grep -o '^[^#].*' file
sed
solusi hanya memiliki satu baris kosong, sepertinya argumen yang kuat untuk menggunakan jawaban lain, kecuali saya kehilangan sesuatu?grep
mungkin? Coba ubahgrep
kecommand grep
, jika Anda masih melihat spasi memposting input sampel.aku percaya
sed
bisa melakukan pekerjaan yang jauh lebih baik daripada inigrep
. Sesuatu seperti ini:Penjelasan
sed
secara default akan melihat file Anda baris demi baris dan mencetak setiap baris setelah mungkin menerapkan transformasi dalam tanda kutip. (sed '' your_file
hanya akan mencetak semua baris tidak berubah).sed
dua perintah untuk tampil di setiap baris (dipisahkan dengan tanda titik koma)./^[[:blank:]]*#/d
. Dalam bahasa Inggris, itu berarti jika baris cocok dengan hash pada awalnya (didahului dengan jumlah kosong awal), hapus baris itu (tidak akan dicetak).s/#.*//
. Dalam bahasa Inggris, gantilah tanda hash diikuti oleh banyak hal yang dapat Anda temukan (sampai akhir baris) yaitu tanpa apa-apa (tidak ada ruang kosong di antara dua yang terakhir//
).sumber
mystring="Hello I am a #hash"
akan menjadimystring="Hello I am a"
crontab
hanya memungkinkan komentar baris penuh, dengan atau tanpa spasi kosong, tapi jangan izinkan komentar tertinggal di baris. Logikanya JAUH lebih sederhana. Gunakan hanya yang pertama dari dua instruksi Sed dalam jawaban ini untuk stripper komentar crontab.)#
(pada kolom 1), apakah ada manfaat untuksed
lebihgrep -v "^#"
?Anda dapat mencapai output yang dibutuhkan menggunakan perintah sed. Perintah di bawah ini telah melakukan trik untukku.
Dimana
#.*$
- Regexp akan memfilter semua string yang dimulai dengan#
hingga akhir barisDi sini kita perlu menghapus garis-garis itu sehingga kita diganti dengan bagian 'penggantian' kosong jadi lewati.
g
- Menyebutkan pencarian berulang pola hingga akhir file tercapai.Sintaks umum sed:
s/regexp/replacement/flags FileName
sumber
sed
perintah itu ...print "#tag" # Print a hashtag.
Seperti yang telah ditunjukkan orang lain, sed dan alat berbasis teks lainnya tidak akan berfungsi dengan baik jika ada bagian skrip yang terlihat seperti komentar tetapi sebenarnya tidak. Misalnya, Anda dapat menemukan # di dalam string, atau yang agak umum
$#
dan${#param}
.Saya menulis formatter shell bernama shfmt , yang memiliki fitur untuk memperkecil kode. Itu termasuk menghapus komentar, antara lain:
Parser dan printer adalah paket Go, jadi jika Anda menginginkan solusi khusus, seharusnya cukup mudah untuk menulis program Go 20-line untuk menghapus komentar dengan cara yang Anda inginkan.
sumber
Anda dapat menggunakan pertandingan terbalik seperti ini:
-v, --invert-match Balikkan indra pencocokan, untuk memilih jalur yang tidak cocok. (-v ditentukan oleh POSIX.)
sumber
evenmorestuff
dalam contoh OP.grep -o '^[^#]*' file
akan menjadi solusi terbaik. ini sudah dijelaskan oleh jimmij. terima kasih atas ulasan Andaprint "#tag" # Print a hashtag.
Saya suka jawaban joseph tetapi membutuhkannya untuk menghapus // komentar juga jadi saya memodifikasinya sedikit & diuji pada redhat
Saya yakin ada cara yang lebih baik untuk menghapus garis kosong daripada menggunakan string tetapi itu adalah solusi cepat & kotor yang saya gunakan.
-tepuk tangan
sumber
print "#tag" # Print a hashtag.
Ini berhasil untuk saya
sumber
print "#tag" # Print a hashtag.
Ini digunakan
#
sebagai pemisah kolom dan membuat hanya kolom pertama (itu adalah segalanya sebelumnya#
).sumber
YOUR_FILE
skrip berisi perintah-perintah itu, skrip akan meninggalkancat YOUR_FILE | cut -'
dalam file pada baris itu.Gunakan ekspresi seperti
: -v: akan melakukan kecocokan terbalik
: #: akan cocok dengan semua baris yang dimulai dengan #
: $ ^: akan cocok dengan semua baris kosong
sumber
#
akan cocok di mana saja di telepon, dan menghapus seluruh telepon.Solusi terbaik adalah dengan menggunakan perintah:
sed -i.$(date +%F) '/^#/d;/^$/d' ntp.conf
-I adalah sunting di tempat tetapi awalan langsung berikut memberitahu sed untuk membuat cadangan. Dalam hal ini dengan ekstensi tanggal (ntp.conf.date) Kami menjalankan dua perintah masing-masing dengan ruang alamat, yang pertama menghapus baris-baris yang dikomentari dan yang kedua, dipisahkan dari yang pertama dengan titik koma, menghapus baris yang kosong.
Saya menemukan solusi ini di: theurbanpenguin.com
sumber
Tak satu pun dari jawaban lain yang tampaknya melakukan keadilan ini, mereka pergi di baris kosong, atau di baris di mana komentar tidak pada karakter pertama. Saya akhirnya menggunakan ini:
Ini mengatur alias, sehingga Anda tidak harus menghafalnya (yang tidak mungkin dimulai dengan). Buka sesi baru, dan Anda akan memiliki
nocom
perintah baru . Maka Anda bisa sajaTepuk tangan.
sumber
.*$
di regex pertama - jangkar tidak berguna dan Anda tidak menangkap teks yang cocok untuk digunakan dalam pengganti. gunakan saja^\s*
print "#tag" # Print a hashtag.
Mengikuti jawaban ke-2 dari Joseph R., saya menambahkan
/^$/d
untuk menghapus baris kosong.sumber
Saya memposting apa yang cocok untuk saya dan sepertinya paling masuk akal, setelah membaca yang lain, dengan penjelasan. Beberapa posting hampir selesai, tetapi saya belum bisa berkomentar (karena saya seorang pemula):
-E
= menginterpretasikan pola berikut sebagai ekspresi reguler, mirip dengan menggunakan egrep-v
= cetak inversi dari pola (garis yang tidak cocok dengan ekspresi akan dicetak)"(^#.*|^$)"
= ini memiliki pipa yang menunjukkan pernyataan ATAU. Ungkapan ini mengatakan untuk mencetak baris yang dimulai dengan#
(dan apa pun setelahnya) ATAU baris apa pun dengan nol karakter antara awal dan akhir baris.The
-v
akan mencetak pada layar inversi itu, yang akan ada sejalan dengan karakter yang tidak dimulai dengan#
.sumber
print "#tag" # Print a hashtag.