Bagaimana saya bisa "menyimpan" file dan menghapus baris komentar?


29

Saya ingin tahu apakah ada cara yang saya bisa catsuka php.inidan hapus semua baris dimulai dengan;

Misalnya, jika file tersebut berisi ini:

;   - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE
;
;   - Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
;
;   - Show all errors except for notices
;
error_reporting  =  E_ALL & ~E_NOTICE

dan saya menjalankan perintah yang benar cat | {remove comments command}, maka saya akan berakhir dengan:

error_reporting  =  E_ALL & ~E_NOTICE

Catatan - Saya berasumsi bahwa catakan menjadi cara terbaik untuk melakukan ini tapi aku benar-benar baik-baik saja dengan jawaban menggunakan utilitas lain seperti awk, sed, egrep, dll


Bagaimana dengan sesuatu seperti itu error_reporting = E_ALL & E_NOTICE ; Show all errors, except for notices? Haruskah komentar dihapus dalam kasus itu juga?
CVn

@ MichaelKjörling - Saya benar-benar baik-baik saja dengan hanya garis yang dimulai dengan komentar yang dihapus
cwd

1
catadalah alat untuk menggabungkan file. grepadalah alat untuk menyaring garis berdasarkan pola. seddan awkjuga dapat memodifikasi garis-garis itu.
Stéphane Chazelas

Jawaban:



25

Anda tidak perlu mem-pipe file melalui grep, grep mengambil nama file sebagai argumen baris perintah.

grep -v '^#' file1 file2 file3

akan mencetak semua baris KECUALI yang dimulai dengan # char. Anda dapat mengubah karakter komentar menjadi apa pun yang Anda inginkan.

Jika Anda memiliki lebih dari satu komentar char (asumsi di awal baris)

egrep -v '^(;|#|//)' filelist

2
Satu lagi saya sudah melakukan itu selalu terjebak dengan saya adalah grep '^[^;]' filename. Saya tidak bisa berbicara dengan portabilitasnya!
Jodie C

@JodieC, itu portabel tetapi juga menghilangkan garis kosong (Yang sering diinginkan). Setara standar egrepadalah grep -E. Anda juga dapat menggunakangrep -ve '^[;#]' -e '^//'
Stéphane Chazelas

9

egrepdapat menghemat penggunaan cat. Dengan kata lain, buat lebih sedikit proses ( egrepvs cat+ egrep) dan gunakan lebih sedikit buffer (pipa dari catke egrepvs tidak ada pipa).

Biasanya merupakan ide bagus untuk membatasi penggunaan catjika Anda hanya ingin meneruskan file ke perintah yang dapat membacanya sendiri.

Dengan ini, perintah berikut akan menghapus komentar, bahkan jika mereka diberi spasi atau tab:

egrep -v '^ [[:: kosong:]] *;' file.ini

Lucu bahwa Anda menggabungkan format regex [[ kelas karakter yang lebih baru ]]dengan penggunaan egrepperintah yang ditinggalkan selama setidaknya satu dekade atau lebih.
mikeserv

Menarik ... dokumen saat ini di gnu.org/software/grep/manual/html_node/… termasuk kelas POSIX.
Jack Wasey

7
egrep -v '^;|^$' $file

yang akan mengecualikan baris yang dimulai dengan ';', dan baris kosong.

dalam regex, ^menunjukkan awal dari suatu garis, dan $akhir dari suatu garis, jadi ^$tentukan garis-garis di mana awal dari karakter garis dan akhir dari karakter garis berada tepat di sebelah satu sama lain.


jadi jika saya membaca ini dengan benar, ini dapat menghapus baris komentar, tetapi juga baris kosong?
cwd

1
@ cwd Ya. Saya tidak yakin mengapa dia memasukkan keduanya, tetapi jika Anda hanya ingin menghapus baris komentar gunakan sajaegrep -v '^;'
Michael Mrozek

4
egrep juga menyukai file (lebih sedikit proses dan buffer yang digunakan), dan sedikit bonus juga untuk menghapus komentar yang egrep -v '^[[:blank:]]*;' file.ini
berlekuk

10
Kami membutuhkan lencana "penggunaan kucing yang tidak berguna".
Simon Richter

@nrolans - sepertinya komentar populer, mengapa tidak menjawabnya?
cwd

2

Sebuah sederhana awksatu-kapal awk '/^;/{next}1' input_fileharus melakukan trik.

[jaypal:~/Temp] cat file
;   - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE
;
;   - Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
;
;   - Show all errors except for notices
;
error_reporting  =  E_ALL & ~E_NOTICE

[jaypal:~/Temp] awk '/^;/{next}1' file
error_reporting  =  E_ALL & ~E_NOTICE
[jaypal:~/Temp] 

3
Benar, tetapi verbose. Cukup awk '!/^;/' input_filesudah.
manatwork

2

Seperti halnya Jaypal, saya juga kemungkinan besar akan menggunakan awkuntuk tujuan ini. Lebih buruk lagi bahwa perl kadang-kadang sangat berguna untuk tujuan seperti:

cat data.txt | perl -lne "print unless /^;/"

Perl regexps lebih kuat dibandingkan dengan awk dan kadang-kadang Anda mungkin membutuhkannya.


+1 untuk perl, meskipun kucing dan -l sama-sama mubazir, jadi doa yang lebih sederhana adalahperl -ne 'print unless /^;/' data.txt
Simon Whitaker

@Simone Whitaker, ya, Anda benar - itu hanya kebiasaan untuk menuliskannya seperti yang saya tulis, dan layak untuk disebutkan.
shabunc

1
Tentu saja. Bahkan, saya pikir catberfungsi dengan baik dalam contoh-contoh ini jika Anda menganggapnya sebagai proxy untuk "segala sesuatu yang menghasilkan teks pada STDOUT" yang lebih umum. Pipa Unix adalah yang terbaik sejak irisan roti, imho. :)
Simon Whitaker

2

Elaborasi pada jawaban @ shabunc, ini menggunakan Perl untuk menghapus komentar (termasuk komentar sebaris), lalu mencetak baris apa pun yang berisi apa pun selain spasi.

$ perl -ne 's/;.*//; print if /\S/' data.txt

Penjelasan:

  • s/;.*//menggunakan operator substitusi ( s/<regex>/<replacement>/) untuk mengganti instance dari titik koma dan segala sesuatu yang mengikutinya pada baris dengan string kosong.
  • print if /\S/mencetak baris jika cocok dengan regexp \S, yang merupakan kelas karakter yang cocok dengan semua karakter non-spasi.

1

Inilah yang saya gunakan, ganti saja ';' dengan karakter komentar (mis. '#' untuk banyak file konfigurasi layanan UNIX):

grep -Ev '^[[:space:]]*;|^$' chan_dahdi.conf.sample | sed 's/;.*$//'

Itu menghilangkan semua komentar seluruh baris (bahkan jika mereka memiliki spasi putih), dan komentar apa pun yang mengakhiri baris non-komentar, dan secara ringkas menghapus baris kosong dari output juga. Ini mungkin dapat dilakukan tanpa pipa (sed-atau awk-fu saya diakui tidak bagus), tetapi sangat mudah bagi saya untuk memahami (dan ingat), saya pikir saya akan mempostingnya di sini.


1

Contoh hanya tampilkan baris + jangan tampilkan baris baru atau baris emtpy:

$ egrep -v '^(;|#|//)' /etc/ssh/sshd_config | tr '\n' ' '

 Protocol 2    SyslogFacility AUTHPRIV      PasswordAuthentication yes  ChallengeResponseAuthentication no   GSSAPIAuthentication yes GSSAPICleanupCredentials yes  UsePAM yes  AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE AcceptEnv XMODIFIERS  X11Forwarding yes   Subsystem sftp    /usr/libexec/openssh/sftp-server 

ATAU

$ egrep -v '^(;|#|//|$)' /etc/ssh/sshd_config    

Protocol 2
SyslogFacility AUTHPRIV
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
UsePAM yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
X11Forwarding yes
Subsystem   sftp    /usr/libexec/openssh/sftp-server

2
Penggunaan egrepsudah lama ditinggalkan. grep -Eadalah perintah yang Anda cari di sini.
mikeserv

0
egrep -v ^'(#|$)' file.txt

Hapus semua komentar dan baris kosong dari file.txt


2
Anda harus mempertimbangkan untuk memperluas jawaban Anda dengan sedikit lebih banyak informasi untuk yang belum tahu (misalnya, apa yang dilakukan regex yang Anda gunakan).
HalosGhost

egrepdisusutkan. Gunakan grep -Evsebagai gantinya.
Yokai


0

Anda dapat menggunakan perintah berikut untuk menyimpan baris, tidak termasuk baris kosong dan baris yang dimulai dengan # dalam file baru

cat <file to be read> | egrep -v '^#|^$' > <file to be written at>


catPipa tidak berguna dan egrepdisusutkan dan diganti dengan grep -Euntuk ekspresi diperpanjang atau adil grep -v.
Yokai
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.