Bagaimana cara mengekstrak teks dari file dalam skrip bash

Saya mencoba mengekstrak teks dari file multi-baris. Misalnya saya perlu mengekstrak semua teks dari "Bagian 1.0" ke "Bagian 3.0"

Ini bisa terjadi di banyak jalur.

Saya memiliki kode yang berfungsi, tetapi tampak kikuk dan lambat. Apakah ada cara yang lebih baik untuk melakukan ini? sed? ekspresi reg?

flag="false"

for line in ${textFile}; 
do
   if [ "$line" == "Section 3.0" ]; then
      flag="false"
   fi
   if [ "$flag" == "true" ]; then
      temp_var+=$line
   fi
   if [ "$line" == "Section 1.0" ]; then
      flag="true"
   fi
done

person Todd Iglehart    schedule 19.03.2014    source sumber


Jawaban (3)


Menggunakan sed Anda dapat melakukan:

sed -n '/Section 1\.0/,/Section 3\.0/p' file

EDIT: Untuk mengabaikan pola awal dan akhir, gunakan:

sed -n '/Section 1\.0/,/Section 3\.0/{/Section [13]\.0/!p;}' file

solusi buruk:

awk '/Section 1\.0/{flag=0} flag{print} /Section 3\.0/{flag=1}' file
person anubhava    schedule 19.03.2014
comment
Ya bagian 1 ada sebelum bagian 3. Kodenya apa adanya sehingga judul bagian sebenarnya tidak tertulis. - person Todd Iglehart; 19.03.2014

sed -n '/Section 1\.0/,/Section 3\.0/p' file

akan mencetak dari file semua baris di antara garis yang cocok dengan ekspresi reguler pertama di mana saja di dalamnya hingga baris berikutnya yang cocok dengan ekspresi kedua. Jika ada beberapa kecocokan, maka akan dicetak dengan cara flip-flop (cari pola 1, cetak melalui pola 2, cari pola 1...)

Jika Anda hanya menginginkan bagian pertama, Anda dapat berhenti ketika Anda menemukan kondisi akhir:

sed -n '/Section 3\.0/q;/Section 1\.0/,$p' file

Ini akan mengecualikan garis yang cocok dengan kondisi akhir (menebak itulah yang sebenarnya Anda inginkan). Untuk mempermudah, ini mengasumsikan Anda tidak memiliki Bagian 3.0 sebelum Bagian 1.0. (Beberapa dialek sed mungkin memerlukan sintaksis yang sedikit berbeda; titik koma mungkin harus diubah ke baris baru, atau skrip dipecah menjadi dua argumen -e terpisah.)

person tripleee    schedule 19.03.2014

awk juga dapat digunakan:

awk '/Section 3\.0/{f=0} f; /Section 1\.0/{f=1}' file
person Jotne    schedule 19.03.2014