GNU/Linux >> Belajar Linux >  >> Linux

Duplikat, Dengan Beberapa Perubahan Kecil, Beberapa Baris Dalam File Teks?

Saya mencoba mencari cara untuk mereplikasi satu rentang baris dalam file teks. Rentang dimulai dengan baris yang unik dalam file tetapi rentang diakhiri dengan baris yang dapat ada di beberapa tempat dalam file.

Berikut beberapa contoh input yang perlu saya proses:

I have no imagination
so this sample text will
Common
be boring. But it does
demonstrate the problem
I am trying to solve.
Common
Hi mom!
This is a unique line.
And here is some more
text that should be copied
as well.
Common
Followed by text that should
not be copied.

Baris yang perlu saya duplikat dan ubah dicetak tebal untuk menunjukkannya di sini.

Output yang saya butuhkan adalah:

I have no imagination
so this sample text will
Common
be boring. But it does
demonstrate the problem
I am trying to solve.
Common
Hi mom!
This is a changed line.
And here is different more
text that should be copied
as well.
Common
This is a unique line.
And here is some more
text that should be copied
as well.
Common
Followed by text that should
not be copied.

Keluaran tambahan dicetak tebal untuk memperjelas.

Saya perlu mendapatkan rentang garis yang dimulai dengan baris:

This is a unique line

dan diakhiri dengan baris:

Common

Rentang garis itu harus dimasukkan sebelum tepat sebelum rentang garis asli. Salinan rentang garis yang cocok perlu sedikit dimodifikasi.

Baris "Umum" yang mengakhiri rentang itu sendiri dapat muncul di banyak tempat di dalam file.

Saya menemukan awk . yang berfungsi skrip tetapi tampaknya jauh lebih rumit daripada yang seharusnya. awk saya keterampilan tidak ada.

/This is a unique line/{flag=1}
/Common/{
    if (flag > 0) {
        n=m;
        sub("some","different",n);
        sub("unique","changed",n);
        print n "\n" $0 "\n" m;
        m=""
    };
    flag=0
};
flag{
    if (length(m) > 0) {
        m=m "\n" $0
    } else {
        m=$0
    }
}
!flag{ print }

Apakah ada cara yang lebih bersih dan tidak terlalu bertele-tele untuk mengimplementasikan ini? Saya terbuka untuk opsi lain selain awk . Itu hanya perlu menjadi perintah standar yang tersedia di macOS.

Jawaban yang Diterima:

awk '/This is a unique line/,/Common/{
   H = H RS $0
   if ( $0 ~ /Common/ ) {
      g = H
      sub("\n","",g)
      sub("some","different",g)
      sub("unique","changed",g)
      $0 = g H
   } else { next }
}1'   inputfile

Berikut sed kode (saya tunjukkan di bagian Jawaban) diterjemahkan ke dalam awk .

Perhatikan bahwa, kode yang Anda miliki, Anda bertanggung jawab untuk MENGAKTIFKAN/MENONAKTIFKAN awk bendera variabel untuk melacak garis. Padahal, awk sudah melakukannya untuk Anda di bawah tenda hal yang sama persis ketika Anda menggunakannya range operator ,


Linux
  1. Cat Line X Ke Line Y Pada File Besar?

  2. Bagaimana Cara Memindahkan Garis Dalam File Teks Ke Atas Atau Ke Bawah Dengan Satu Baris?

  3. Ganti Rentang Garis Dengan Rentang Garis (sed Atau Lainnya)?

  1. Ganti Garis yang Mencocokkan Pola Dengan Garis Dari File Lain Secara Berurutan?

  2. Bagaimana Cara Menambahkan Beberapa Baris Ke File?

  3. Cara Menghitung baris dalam file di UNIX/Linux

  1. Bagaimana Cara Menghapus Garis Duplikat Di Dalam File Teks?

  2. Sisipkan Baris Baru Dengan Nilai yang Hilang (na)?

  3. gema teks dengan baris baru di bash