Saya ingin mengedit file di tempat dengan menambahkan baris, hanya jika belum ada untuk membuat script saya anti peluru.
Biasanya saya akan melakukan sesuatu seperti:
cat >> ~/.bashrc <<EOF
export PATH=~/.composer/vendor/bin:\$PATH
EOF
Dimungkinkan juga untuk melakukannya via ansible ( line
+ insertafter=EOF
+ regexp
), tapi ini cerita lain.
Dalam vi / ex saya bisa melakukan sesuatu seperti:
ex +'$s@$@\rexport PATH=\~/.composer/vendor/bin:$PATH@' -cwq ~/.bashrc
tetapi kemudian bagaimana saya memeriksa apakah saluran sudah ada (dan dengan demikian tidak melakukan apa-apa) idealnya tanpa mengulangi baris yang sama?
Atau mungkin ada beberapa cara yang lebih mudah untuk melakukannya di Ex editor?
substitute
ex-command
kenorb
sumber
sumber
grep -Fq 'export PATH=~/.composer/vendor/bin:$PATH' ~/.bashrc || ex ...
(ataucat
, dalam hal ini)?ex ~/.bashrc -c "if search('export PATH=\~\/.composer\/vendor\/bin:\$PATH')>0 | norm quit | endif | norm Aexport PATH=~/.composer/vendor/bin:$PATH"
export
adalah perintah , jadi sisa baris adalah kata shell, BUKAN tugas. Karena itu tidak seperti dengan penugasan variabel (yang tidak digunakanexport
), Anda perlu tanda kutip ganda atau itu akan pecah di spasi putih . Juga lihat Cara menambahkan jalur ke PATH dengan benar .Jawaban:
Jika Anda ingin anti peluru , Anda mungkin menginginkan sesuatu yang sedikit lebih portabel daripada opsi rumit di atas. Saya akan tetap berpegang pada fitur POSIX
ex
dan membuatnya bodoh-sederhana: Cukup hapus baris jika ada (terlepas berapa kali itu ada), tambahkan ke akhir file, lalu simpan dan keluar:Saya berlabuh regex untuk menambah ketahanan, meskipun saya pikir hampir tidak mungkin untuk secara tidak sengaja cocok dengan regex ini. (Berlabuh berarti menggunakan
^
dan$
regex hanya akan cocok jika cocok dengan seluruh baris.)Perhatikan bahwa
+cmd
sintaksis tidak diperlukan oleh POSIX, juga fitur umum yang memungkinkan beberapa-c
argumen.Ada banyak cara sederhana lainnya untuk melakukan ini. Misalnya, tambahkan baris ke akhir file, lalu jalankan dua baris terakhir file melalui filter UNIX eksternal
uniq
:Ini sangat sangat bersih dan sederhana, dan juga sepenuhnya kompatibel dengan POSIX. Ini menggunakan fitur Escape
ex
untuk penyaringan teks eksternal, dan utilitas shell yang ditentukan POSIXuniq
Intinya adalah,
ex
ini dirancang untuk mengedit file di tempat dan itu adalah jauh cara yang paling portabel untuk mencapai itu secara non-interaktif. Itu bahkan sudah ada sebelum aslinyavi
, sebenarnya — namavi
itu untuk "editor visual", dan editor non-visual yang digunakannya adalahex
.)Untuk kesederhanaan yang lebih besar (dan untuk menguranginya menjadi satu baris), gunakan
printf
untuk mengirim perintah keex
:sumber
Solusi yang mungkin adalah membuat fungsi untuk melakukan itu:
Pertama kita membuat variabel lokal
l:res
yang akan digunakan untuk menghitung jumlah kemunculan baris.Kami menggunakan
global
perintah: setiap kali garis dicocokkan,l:res
bertambah.Akhirnya jika
l:res
masih 0 itu berarti bahwa baris tersebut tidak muncul dalam file jadi kami pergi ke baris terakhir terima kasihG
, dan kami membuat baris baruo
yang dengannya kami menulis baris untuk ditambahkan.Catatan 1 Metode yang saya gunakan untuk mengatur nilai
l:res
sedikit berat dan dapat diganti dengan yang disarankan oleh @Alex dalam jawabannya dengan sesuatu seperti:Catatan 2 Juga untuk membuat fungsi lebih fleksibel Anda bisa menggunakan argumen:
escape()
menambahkan\
di depan karakter yang dapat menyebabkan masalah dalam pencarian.Perhatikan juga bahwa Anda masih harus keluar
\
sendiri saat memanggil fungsi (saya tidak berhasil melarikan diri\
secara otomatis):sumber
Mencoba:
Catatan yang
:append
tidak akan berfungsi di dalamif endif
-block dengan mode Ex (lihat VimDoc ) jadi saya harus meletakkan dinorm A...
luar.sumber
Saya biasanya menggunakan:
sumber
Untuk menyederhanakan dan menghindari kehadiran banyak orang
\
, baris yang akan ditambahkan adalahexport PATH=mybin:PATH
.Strategi utama: gantikan
mybin
teks " non- " (semua file) dengan teks + mybin-path-definition:atau dengan lekukan yang lebih didaktik :
Jika kami memiliki kecocokan:
&
memiliki teks lengkapbashrc
dan&
tidak mengandung/mybin:/
begitu:
PEMBARUAN : Akhirnya, kita dapat membuat skrip vim:
chmod 755 dan instal. Pemakaian:
bashrcfix
hati-hati: dalam
\v
mode,=
berarti opsionalsumber
Sebagian besar dari jawaban ini tampaknya rumit bagaimana dengan perintah shell lama yang baik:
Ini bisa dengan mudah menjadi fungsi Bash:
EDIT : Kode keluar grep penting dan dalam hal ini perlu dibalik penggunaannya
! grep
;grep -v
tidak akan keluar seperti yang diharapkan dalam situasi ini. Terima kasih @joeytwiddle atas tipnya.sumber
grep -v
memberi Anda kode keluar yang Anda inginkan. Tetapi! grep
harus melakukannya.-v
hanya!
.-F
sehinggagrep
dosnot menafsirkan karakter sebagai ekspresi reguler, dan 2. Gunakan-q
alih-alih mengarahkan/dev/null
. Lihat komentar saya sebelumnya pada pertanyaan .-q
dan-F
opsi? Saya pikir>/dev/null
itu lebih universal di antara platform yang berbeda (sun vs hp vs Mac OS X vs Ubuntu vs FreeBSD vs ...)