Hapus semua baris yang dimulai dengan # dari file


182

Semua baris dengan komentar dalam file dimulai dengan #. Bagaimana saya bisa menghapus semua baris (dan hanya baris itu) yang dimulai dengan #? Baris lain yang berisi #, tetapi tidak di awal baris harus diabaikan.


1
Apakah itu harus bekerja dengan konvensi umum yang #blah \<nl>blahdianggap sebagai satu "garis logis" karena garis miring terbalik dari baris baru?
— sarnold

@sarnold: selain make, utilitas mana yang menggunakan 'garis backslash splices sebelum mengakhiri komentar'? Kerang (bash dan ksh diuji) tidak. C dan C ++ menangani splicing baris baru sebelum pemrosesan arahan preprosesor lainnya, tetapi arahan bukan komentar.
— Jonathan Leffler

@ Jonathan: Luar biasa. Saya berasumsi bahwa \<nl>pelarian bersama juga akan berfungsi pada komentar. Tapi wow saya salah. Saya belum dapat menemukan contoh lain ... :) Terima kasih!
— sarnold

Jawaban:


302

Ini dapat dilakukan dengan sed one-liner :

sed '/^#/d'

Ini mengatakan, "temukan semua baris yang dimulai dengan # dan hapuslah, tinggalkan yang lainnya."


9
versi lebih pendek:sed /^#/d
— kev

80
Untuk noobs linux seperti saya:sed '/^#/ d' < inputFile.txt > outputFile.txt
— Neil McGuigan

50
Versi Terpendek: sed -i '/^#/d' filepath.
— lesderid

14
Dan sed -i '' '/^#/d' filepathdi Mac ( karena sufiks -i adalah wajib )
— paulcm

1
@ Viesturs Coba ini: awk '/^#/ && !first { first=1 ; next } { print $0}'
— Raymond Hettinger

56

Saya sedikit terkejut tidak ada yang menyarankan solusi yang paling jelas:

grep -v '^#' filename

Ini menyelesaikan masalah seperti yang dinyatakan.

Tetapi perhatikan bahwa konvensi umum adalah untuk segala sesuatu dari a #hingga akhir baris untuk diperlakukan sebagai komentar:

sed 's/#.*$//' filename

meskipun itu memperlakukan, misalnya, #karakter dalam string literal sebagai awal komentar (yang mungkin atau mungkin tidak relevan untuk kasus Anda) (dan meninggalkan baris kosong).

Baris yang dimulai dengan spasi putih sewenang-wenang yang diikuti oleh #mungkin juga diperlakukan sebagai komentar:

grep -v '^ *#' filename

jika spasi putih hanya spasi, atau

grep -v '^[  ]#' filename

di mana kedua spasi sebenarnya adalah spasi diikuti oleh karakter tab literal (ketik "control-v tab").

Untuk semua perintah ini, abaikan filenameargumen untuk membaca dari input standar (misalnya, sebagai bagian dari pipa).


Saya telah menambahkan jawaban baru yang dibangun berdasarkan jawaban ini.
— Acumenus

Saya punya masalah menggunakan grep dengan cara ini di Windows. Solusinya adalah mengganti 'dengan ", misalnyagrep -v "^#" filename
— Serg

14

Kebalikan dari solusi Raymond:

sed -n '/^#/!p'

"jangan cetak apa pun, kecuali baris yang TIDAK mulai dengan #"


9

Anda dapat langsung mengedit file Anda dengan

sed -i '/^#/ d'

Jika Anda ingin, hapus juga baris komentar yang dimulai dengan penggunaan spasi putih

sed -i '/^\s*#/ d'

Biasanya, Anda ingin mempertahankan baris pertama skrip Anda, jika itu adalah sha-bang, jadi sedsebaiknya jangan hapus baris yang dimulai dengan #!. juga harus menghapus baris, yang hanya berisi hash tetapi tidak ada teks. kumpulkan semuanya:

sed -i '/^\s*\(#[^!].*\|#$\)/d'

Agar sesuai dengan semua varian sed, Anda perlu menambahkan ekstensi cadangan ke -iopsi:

sed -i.bak '/^\s*#/ d' $file
rm -Rf $file.bak

1
ditambah 1 untuk yang ruang
— deepaksingh pawar

7

Anda dapat menggunakan yang berikut ini untuk solusi awk -

awk '/^#/ {sub(/#.*/,"");getline;}1' inputfile


-3

Ini dia dengan loop untuk semua file dengan beberapa ekstensi:

ll -ltr *.filename_extension > list.lst

for i in $(cat list.lst | awk '{ print $8 }') # validate if it is the 8 column on ls 
do
    echo $i
    sed -i '/^#/d' $i
done
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.