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!


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.


@ 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

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


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.

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.