GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Perintah Sed '1!g;h;$!d' Membalikkan Isi File?

Pertanyaan saya terkait dengan sed -solusi spesifik yang diberikan dalam jawaban ini untuk pertanyaan tentang grep terbalik ini. sed /grep solusi yang tidak dapat saya uraikan adalah sebagai berikut:

sed '1!G;h;$!d' file

Bisakah seseorang menguraikan perintah ini?

Saya tahu dari pengetahuan VI(M) bahwa G menunjukkan baris terakhir file dan bahwa dalam sed a bang(!) diikuti oleh alamat yang berfungsi seperti grep -v artinya tidak akan cocok dengan garis itu. Namun secara keseluruhan script sed inline di atas berada di luar jangkauan saya.

Jawaban yang Diterima:

Ini membalikkan file baris demi baris.

sed '1!G;h;$!d' file

Pertama, sed memiliki ruang tahan dan ruang pola . Kita harus membedakannya sebelum berkonsentrasi pada perintah khusus itu.

Ketika sed membaca baris baru, itu dimuat ke dalam ruang pola. Oleh karena itu, spasi itu ditimpa setiap kali baris baru diproses. Di sisi lain, ruang penyimpanan konsisten di seluruh pemrosesan dan nilai dapat disimpan di sana untuk penggunaan nanti.

Untuk perintah:

Ada 3 perintah dalam pernyataan ini:1!G , h dan $!d

  • 1!G artinya G perintah dijalankan pada setiap baris kecuali yang pertama (! meniadakan 1 ). G artinya menambahkan apa yang ada di ruang tahan ke dalam ruang pola.

  • h berlaku untuk setiap baris. Itu menyalin ruang pola ke ruang penahanan (dan menimpanya).

  • $!d berlaku untuk setiap baris kecuali yang terakhir ($ mewakili baris terakhir, ! meniadakannya). d adalah perintah untuk menghapus baris (spasi pola).

  1. Sekarang, ketika baris pertama dibaca, sed mengeksekusi h memerintah. Baris pertama disalin ke ruang tunggu. Kemudian dihapus, karena cocok dengan $! kondisi. sed dilanjutkan dengan baris kedua.
  2. Baris kedua cocok dengan kondisi 1! (ini bukan baris pertama), dan ruang penahan (yang memiliki baris pertama) ditambahkan ke ruang pola (yang memiliki baris kedua). Setelah itu, di ruang pola, sekarang ada baris kedua diikuti oleh baris pertama, dibatasi oleh baris baru. Sekarang, h perintah berlaku (seperti di setiap baris); semua yang ada di ruang pola disalin ke ruang penahanan. Pernyataan ketiga ($!d ) berlaku:Garis dihapus dari ruang pola.
  3. Langkah 2 sekarang dilakukan dengan semua baris. Kita lompat ke baris terakhir.
  4. Di baris terakhir ($ ) hampir semua Langkah 2 selesai, tetapi bukan bagian yang dihapus (d ). sed , ketika dipanggil tanpa -n , mencetak ruang pola secara otomatis di akhir pemrosesan untuk setiap baris input. Jadi, ketika tidak dihapus, ruang pola dicetak. Sekarang berisi semua baris dalam urutan terbalik .
Terkait:Menambal biner dengan dd?
Linux
  1. Bagaimana Melewati Isi File Sebagai Parameter Baris Perintah?

  2. Bagaimana Cara Kerja Perintah Tee??

  3. Bagaimana Perintah Xdg-open Mengetahui Aplikasi Yang Digunakan Untuk Membuka File?

  1. Bagaimana cara me-mount dari baris perintah seperti yang dilakukan Nautilus?

  2. Bagaimana cara menambahkan output ke file?

  3. Bagaimana cara membaca baris kedua hingga terakhir dalam file menggunakan Bash?

  1. Cara menggunakan perintah sed Linux

  2. Bagaimana Cara Menyisipkan Teks Sebelum Baris Pertama Sebuah File?

  3. Bagaimana cara mendapatkan URL file Dropbox dari baris perintah?