sed, masukkan file sebelum baris terakhir

7

Berikut metode penyisipan file untuk seddigunakan agar dapat berfungsi, bahkan sebelum baris terakhir, tetapi tidak lagi. Apakah ini bug saat ini sed?

Demo memasukkan metode file dengan sed:

mkdir /tmp/test
printf '%s\n' {1..3} > /tmp/test/f1
printf '%s\n' {one,two,three,four,five,six,seven,eight,nine,ten} > /tmp/test/f2

$ cat /tmp/test/f2 | sed -e "/nine/r /tmp/test/f1" -e //N
one
two
three
four
five
six
seven
eight
1
2
3
nine
ten

$ head -9 /tmp/test/f2 | sed -e "/nine/r /tmp/test/f1" -e //N
one
two
three
four
five
six
seven
eight
nine
1
2
3

$ cat /tmp/test/f2 | sed -e "/ten/r /tmp/test/f1" -e //N
one
two
three
four
five
six
seven
eight
nine
ten
1
2
3

$ sed --version
GNU sed version 4.2.1
... 

Yaitu, memasukkan file sebelum metode garis bekerja di mana-mana kecuali baris terakhir. Dulu bekerja sebelumnya. Apakah ini bug saat ini sed?

Terima kasih

xpt
sumber
Saya sudah berusaha keras untuk mencapainya tanpa keberhasilan. Saya akan beralih ke awkatau perl, tetapi hanya ingin tahu, yang merupakan versi kerja sebelumnya?
Birei
Saya tidak begitu mengerti mekanisme // N. Tetapi jika Anda ingin menambahkan teks sebelum baris terakhir, mengapa tidak menambahkannya ke baris sebelum terakhir? Jadi, lewati // N maka itu akan selalu ditambahkan. Sekarang Anda ingin teks dari file f1 sebelum baris terakhir$ echo -e 'one\ntwo\nthree\nfour' | sed -e '/three/r ./f1'
barlop
"Kenapa tidak menambahkannya saja ke baris sebelum terakhir?" Masalahnya adalah Anda tidak dapat memprediksi garis apa yang akan terjadi sebelum itu, jadi saya HARUS mencocokkannya dengan baris terakhir , lalu masukkan sebelumnya. @ Birei, saya tidak menyimpan versinya, saya juga tidak menyimpan waktu saya mengujinya. Tapi saya menggali di atas dari catatan saya, yang sudah berfungsi sebelumnya.
xpt
@ xpt Saya setuju akan lebih baik untuk menjadi lebih umum tetapi Anda memprediksi baris terakhir karena dalam contoh Anda Anda menyatakannya secara eksplisit / sepuluh / jadi tahu sebelumnya bahwa 'sepuluh' adalah baris terakhir.
barlop
Tepat @barlop. Sama seperti file html, Anda tidak tahu apa isinya, tetapi file html yang terbentuk dengan baik akan selalu memiliki ' </body>' sebagai yang terakhir kali. Contohnya saja
xpt

Jawaban:

5

Karena Anda aktif, gnu sedAnda dapat menggunakannya

'e [COMMAND]'
     This command allows one to pipe input from a shell command into
     pattern space.

pada $baris pertama:

sed '$e cat insert.txt' file

Dengan ed(ganti ,pdengan wjika Anda ingin mengedit di tempat):

ed -s file<<IN
- r insert.txt
,p
q
IN

atau

ed -s file <<< $'-1 r insert.txt\n,p\nq\n'

Ketika edmembaca filealamat saat ini diatur ke $baris pertama. -(atau -1) mengatur alamat saat ini ke satu baris sebelum (yaitu $-1) dan rmembaca insert.txtsetelah baris saat ini. ,pmencetak konten buffer teks (seperti yang saya katakan, ganti dengan wuntuk menyimpan perubahan) dan qkeluar dari editor.

don_crissti
sumber
Itu bekerja dengan sempurna! (Diuji dengan sed '$e cat /tmp/test/f1' /tmp/test/f2menggunakan file yang diberikan dalam OP). Terima kasih!
xpt
5

Menurut komentar Anda, "HARUS cocok dengan baris terakhir ", jadi saya akan mempertimbangkan untuk menggunakan $(baris terakhir) dan i(masukkan perintah) di sed. Sebagai contoh:

sed '$ i\INSERT BEFORE LAST LINE' number.txt
1
2
3
4
INSERT BEFORE LAST LINE
5

Pastikan saja file tersebut tidak memiliki baris kosong sebagai baris terakhir dan itu akan berfungsi. Perhatikan jarak antara tanda dolar dan tanda igaris miring terbalik ( \) setelah tanda i. Ini akan memasukkan teks setelah garis miring terbalik ke baris terakhir tanpa perlu /pattern/untuk baris terakhir.

CATATAN: Perintah ini hanya akan menambahkan satu baris teks sebelum baris terakhir, bukan file. Jika Anda ingin menyisipkan konten file sebelum baris terakhir.

Jika Anda ingin menambahkan seluruh file (dan Anda tidak melakukannya sed), saya akan menggunakan ini:

    head -n-1 first_file.txt && cat inserted_file.txt && tail -n1 first_file.txt 

Ini harus menampilkan segala sesuatu kecuali baris terakhir, maka catyang tersebut inserted_file.txtdan kemudian menampilkan baris terakhir dari first_file.txt.

skamazin
sumber
yang menempatkan baris sebelum baris terakhir tetapi dia mengatakan memasukkan file sebelum baris terakhir
barlop
1
Metode ini menempatkan baris sebelum baris terakhir, tetapi tidak memasukkan file yang benar. Saya akan mencatat hal itu dalam jawaban saya. Terima kasih
skamazin
1
'jawaban' Anda mungkin layak sebagai komentar tetapi saya yakin op menyadarinya dan tidak menjawab pertanyaan
barlop