Bagaimana cara mengganti teks antara dua penanda dalam file dengan bagian teks dari file lain?

8

Katakanlah saya memiliki blok teks di ~/.bashrc:

#~/.bashrc
# ...some commands...

# aliases
alias suicide='sudo rm -rf /'
# end aliases

# other commands

Saya ingin mengganti blok teks itu dengan beberapa teks lain yang terkandung di antara dua penanda di file lain: stuff-to-place-in-bashrc.txt

# stuff-to-place-in-bashrc.txt
# ...stuff...

# aliases
alias ldir='ls * -d'
alias ithinklifeisworthliving='echo all good'
# end aliases

# ...more stuff...

Saya sudah mencoba

 sed -ne 's/# aliases\s+\(.*\)\s+# end aliases/\1/' stuff-to-place-in-bashrc.txt

Tapi aku benar-benar berayun dalam gelap di sini. Bisakah seseorang membantu saya?

  1. Bagaimana cara mengekstrak teks dari stuff-to-place-in-bashrc.txt?

  2. Bagaimana cara mengganti bagian lain ~/.bashrcdengan teks yang diekstraksi dari pertanyaan 1?

Edit

Terima kasih untuk pembaruan kawan-kawan, mereka yang bertanya-tanya mengapa saya menginginkan sesuatu seperti ini:

memungkinkan pembaruan yang dipilih cherry ke file skrip tanpa menimpa penambahan buatan pengguna. berguna untuk lingkungan operasi standar bersama dan sering diperbarui (seperti pekerjaan terakhir saya di Tyro yang dikodekan dengan XP).

menjadi orang gila.

thenaglecode
sumber
Juga lihat Tangkap teks antara kurung kurawal di C preprocessed berkas . Ubah "kurung kurawal" dengan token awal dan akhir Anda ( # aliasesdan # end aliases), dan itu bisa bekerja untuk Anda.

Jawaban:

9

Ed adalah editor standar, karena Anda dapat menggunakannya untuk mengembangkan skrip ed dan membiarkannya melakukan tugasnya, seperti yang Anda uji sebelumnya, secara interaktif. Untuk file kecil seperti .bashrcatau teks kode apa pun, ed adalah performan karena ed membaca seluruh file dalam satu rush dan bekerja dengan buffer. Untuk alasan yang sama Anda tidak boleh menggunakan ed untuk file besar seperti file log.

Tetapi dengan skrip ed, pekerjaan Anda selesai dalam waktu singkat:

ed ~/.bashrc<<EOF
/^# aliases
+,/^# end aliases/-1d
-r !sed -n '/^# aliases/,/^# end aliases/p' stuff-to-place-in-bashrc.txt|grep -v '^#'
w
q
EOF

Saya menggunakan skrip serupa untuk secara otomatis menyetel file konfigurasi, seperti juga .asoundrc untuk berbagai lingkungan tempat saya membawa laptop saya.

Dokumen terbaik tentang ed datang sebagai halaman manual sederhana dari sistem PLAN9 yang sangat keren . Saya menerjemahkannya ke dokumen postscript ed.ps. Jika Anda tertarik pada PLAN9, Anda harus memeriksa 9front dan http://cat-v.org/ karena versi lab lonceng asli masih dipertahankan tetapi memiliki sistem file yang sangat sederhana.

Kata terakhir tentang perang editor, emacs, vim dan sejenisnya: acme rules!

ikrabbe
sumber
Terima kasih atas jawabannya, Ini berhasil, namun saya tidak yakin apa sintaksinya. Apakah ini menggunakan regex atau sesuatu yang lebih spesifik untuk diedit? sepertinya ada perintah seperti vim ( w, q)
thenaglecode
Ini menggunakan regexes ( /^# aliases, dan /^# end aliases/), dan perintah lainnya adalah Vi / Ed. Lihat, misalnya, vimhelp.appspot.com/cmdline.txt.html#%3 Atur untuk +, /^# end aliases/.
muru
1
lihat info Eddi sistem Anda (mudah-mudahan). Saya tidak tahu mengapa distribusi linux modern tidak menginstal editor keren ini. w dan q adalah perintah tulis dan berhenti. Dan ed bekerja sangat mirip dengan sed dengan regex. Ada alasan mengapa nama-nama itu terdengar sama. d berarti menghapus garis-garis yang ditekankan, -r membaca ke baris sebelumnya hasil dari !perintah yang mengikuti. Saya mempersingkat nama file pada hasil edit, karena saya malas mengetik pagi ini.
ikrabbe
1
@thenaglecode lihat hasil edit terakhir saya. Saya harus mengujinya sebelum saya mempostingnya.
ikrabbe
1
@thenaglecode Satu-satunya halaman yang benar-benar bagus tentang ed yang pernah saya butuhkan adalah halaman ed (1) dari plan9: man.cat-v.org/plan_9/1/ed Saya dapat mengirimkan kepada Anda versi postscript jika Anda mau. Karena kita hanya berbicara tentang plan9, lihat juga Acme Editor. Jika Anda terbiasa dengan itu, Anda tidak akan pernah menggunakan sesuatu yang lain. Tentu saja yang terbaik adalah menggunakan sistem plan9, misalnya sebagai mesin virtual di dalam kotak linux Anda, tetapi port p9p untuk unix juga bagus. (Ada sedikit perbedaan antara plan9 ed dan gnu ed!)
ikrabbe
2
set /^\#aliases/  /^\#end\ aliases/
sed -ne"$1,$2"'s/\\\{0,1\}/&&/gp' <stuff_to_place...rc |
sed -e"$1,$2c\" -f- ./infile >./outfile

Jika Anda ingin mengedit file di tempat edadalah solusi yang sangat bagus. Jika Anda ingin mengeditnya dalam-aliran, gunakan sed. Hindari sed -i.

mikeserv
sumber
0

Tentu, Anda bisa melakukan ini edsendirian, tidak perlu alat tambahan:

ed -s stuff_to_place.txt<<\IN
1,/# aliases/d
/# end aliases/,$d
,d
.r /home/username/.bashrc
/# aliases/x
.t.
.,/# end aliases/-d
,p
q
IN

jika Anda puas dengan hasilnya, ganti ,pdengan w /home/username/.bashrcuntuk menulis perubahan ~/.bashrc(perhatikan jalur lengkap yang digunakan dengan rdan w; Anda dapat menggunakan .bashrcjika itu ada di cwd).
Cara kerjanya: pertama-tama kita dmenghapus garis yang tidak dibutuhkan dari stuff_to_place.txt. Lalu kami menghapus yang tersisa (alias) dengan ,d. Buffer teks sekarang kosong sedangkan cut buffer berisi baris yang kita inginkan. Kami kemudian read konten .bashrcke dalam buffer teks, menempatkan konten cut buffer ( x) ke setelah /# aliases/baris, duplikat baris terakhir yang ditempelkan ( .t.) kemudian hapus dari baris yang digandakan hingga tetapi tidak termasuk /# end aliases/dan akhirnya pbajak atau writus perubahan dan quit.

don_crissti
sumber