mengambil header / blok komentar

1

Saya memiliki sejumlah file log yang terlihat seperti ini:

/*
header
arbitrary number of lines
*/
blah blah
blah blah

Menggunakan perintah Bash sederhana (lebih disukai sed, bukan awk), bagaimana saya akan mengambil hanya baris header (idealnya termasuk penanda komentar)?

Saya sudah RTFM dan mencoba googling, juga ditemukan beberapa petunjuk , tapi tidak cukup untuk memulai.

Terima kasih!

AnC
sumber
Tautan terkait lainnya: cyberciti.biz/faq/sed-howto-remove-lines-paragraphs Itu melakukan kebalikan dari apa yang saya butuhkan.
AnC

Jawaban:

2

Jika Anda mengkonfirmasi hal-hal berikut, skrip dalam jawaban ini akan bekerja untuk Anda.

  1. File dimulai dengan " /* "karakter
    • Mungkin ada blok komentar C-Syntex multi-baris yang tidak bersarang
    • Blok komentar berakhir dengan tidak ada Pernyataan-C tambahan pada baris yang sama
sed -n '/^\/\*/,/\*\// p' file.c
#        - - -    - - 

Ini akan cocok dengan semua baris dari awal file hingga akhir blok komentar.
Baris kedua (dengan " # "di awal) menyoroti pertandingan yang sedang dicari.
" -n "Di awal dan" p "pada akhirnya minta sed untuk mencetak hanya bagian yang cocok.

nik
sumber
@ ANC, saya pikir ada masalah dalam solusi saya juga. Itu tidak berhenti seperti Richard Perintah setelah pertandingan pertama! Jadi, Anda akan mendapatkan semua komentar mulai dari baris baru (persyaratan 1 tidak terbatas pada awal file) dalam file.
nik
Baru menyadari bahwa - jadi saya sekarang menggabungkan kedua solusi Anda: cat $ LOGFILE | sed -e '/ * \ // q' | sed -n '/ ^ \ / * /, / * \ // p' Sedihnya, saya tidak bisa memberikan kredit kepada Anda berdua.
AnC
@ ANC, Anda bisa melakukan: sed -n '/^\/*/,/*\// p' $LOGFILE | sed -e '/*\//q' dan lewati cat. Tapi, saya belum senang tentang itu.
nik
1

Ini terlihat pada setiap file dengan ekstensi .log dan jika baris pertama adalah "/ *" saja, cetak semuanya hingga satu baris dengan "* /" saja.

for file in *.log; do
      head -n1 $file | grep  -q '^/*' &&
      sed '/^\*\/$/q' $file; 
done
Richard Hoskins
sumber
1
Itu berhasil - terima kasih! Satu peringatan: Ini tidak akan berfungsi jika ada sesuatu di atas header, atau jika ada beberapa blok komentar. Namun, saya tidak perlu khawatir tentang itu sampai saya benar-benar membutuhkannya.
AnC
Dan jika tidak ada tajuk, itu akan mencetak seluruh file! Ada banyak mode kegagalan. Mungkin Anda dapat mengajukan pertanyaan, "Bagaimana saya bisa mencetak komentar dalam file?" (Dan tolong beri kami awk.)
Richard Hoskins
Anda benar - solusi nik tampaknya sedikit lebih aman dalam hal itu, jadi saya akan menggunakannya untuk saat ini. Terima kasih lagi!
AnC
Saya telah memperbarui jawaban saya untuk menyingkirkan sebagian besar masalah terburuknya.
Richard Hoskins
Pendekatan yang menarik. Sekarang saya terpecah antara ini dan kombinasi dari kedua solusi Anda (lihat komentar di atas) ...
AnC
0
cat *.log | sed -e 's/*\/\*//g' -e 's/\*\///g' >> smt.log

Mungkin itu

Defiant91
sumber
Saya khawatir hanya menghapus baris "* /". Saya telah bereksperimen dengan ekspresi yang sama, tetapi tidak sampai ke mana pun - saya pikir itu karena sed bekerja berdasarkan garis demi garis.
AnC
0

Dalam hal, jika seperti saya Anda menemukan pertanyaan ini ketika mencoba untuk mengambil komentar gaya Doxygen, perintah sed adalah:

sed -n '/^\/\*/p; /^ \*/p' < file

Untuk penjelasan lebih rinci, saya di-blog tentang itu.

Greg K
sumber