Cari dan ganti karakter kontrol (^ @, ^ M, ^ I…) di vi

14

Saya menyalin baris ini dari /proc/some_proc_id/cmdlinedi mesin ubuntu saya,

java^@-jar^@/usr/lib/selenium/selenium-server-standalone.jar^@-port^@4444^@-trustAllSSLCertificates^@

Entah bagaimana, karakter spasi diwakili oleh ^@in vi. Saya mencoba menggantinya dengan karakter spasi menggunakan perintah,

:%s#^@# #g

Tetapi dikatakan pattern not found ^@,.

Bagaimana cara mengganti karakter khusus terutama yang dimulai dengan simbol karat?

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Apa jenis terminal yang Anda gunakan?
Ed Heal
pada waktu, TERMdan banyak kali, itu adalahscreen
Apa program terminal yang Anda gunakan dan apakah TERMvariabel lingkungan diatur dengan benar?
Ed Heal

Jawaban:

15

Entah bagaimana, karakter spasi diwakili oleh ^@in vi.

Bukan itu viyang melakukan itu. Meskipun Anda mengetikkan baris perintah dalam shell dengan spasi di antara argumen, baris perintah sebenarnya urutan diskrit secara internal, bukan satu string panjang yang dipisahkan spasi. Shell memisahkan baris perintah menjadi string argumen individu sebelum perintah diluncurkan.

Di C, string diakhiri dengan NUL karakter dan mereka ditampilkan sebagai ^@.

Bagaimana cara mengganti karakter khusus terutama yang dimulai dengan simbol karat?

Untuk mengetikkan karakter-karakter itu, Anda harus mengawali mereka dengan Control- vuntuk karakter berikutnya yang sebenarnya.

Misalnya dalam hal ini: Control- vdiikuti oleh Control- @.

Karakter khusus yang memperkenalkan karakter berikutnya secara literal biasanya Control- vtetapi sebenarnya dapat dikonfigurasi. Ketik stty -auntuk mencari tahu apa itu diatur. Cari lnextdi output.

Celada
sumber
posting ini informatif .. tetapi solusi nyata untuk pertanyaan saya adalah melarikan diri dari simbol karat - :%s#^@##g. Sejak saya salin, disisipkan dari terminal, vi telah menempelkannya sebagai karakter asli ...
1
@MadhavanKumar Anda tidak lepas dari simbol sisipan, karena ada adalah tidak ada simbol tanda sisipan. Ini benar-benar karakter kontrol yang sebenarnya. ^letterhanyalah notasi visual untuk itu, tidak ada tanda sisipan nyata yang terlibat. Dan ya, Anda harus melarikan diri dari karakter kontrol, Ctrl-V adalah bagaimana Anda melakukannya dari keyboard. Itu paling berhasil di mana-mana. FYI, jawaban lain berisi alternatif, khusus untuk vibaris perintah, untuk menghindari keharusan mengetikkan karakter kontrol sama sekali.
Celada
@MadhavanKumar Jika terminal Anda menampilkan karakter NUL sebagai string dua karakter ^@dan Anda menyalinnya, lalu gunakan \^@untuk mewakili string dua karakter di vi. Banyak perangkat lunak menggunakan backslash yang berarti "menafsirkan karakter berikutnya secara harfiah alih-alih menggunakan fungsi khusus".
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles, Anda benar .. itulah yang saya coba sampaikan kepada Celada ....
4

Itu simbol mewakili karakter NULL, dengan nilai ASCII 000.

Kamu bisa mencoba:

:%s/\%x00/ /g

Alternatif:

Pada keyboard di mana simbol @ berada di atas 2tombol (terima kasih Celada), Anda dapat melakukannya:

  • %s/<CTRL-2>/ /g (di PC)

  • %s/<CTRL-SHIFT-2>/ /g (di Mac)

di mana <CTRL-2>berarti pertama-tama menekan CTRLPC, menjaganya seperti ditekan, tekan 2, lepaskan CTRL.

dan <CTRL-SHIFT-2>berarti pertama-tama tekan ke bawah controlpada Mac, jaga agar ditekan, tekan ke bawah shiftpada Mac, jaga agar ditekan, tekan 2, lepaskan controldan shift.

Akhirnya, kedua perintah harus menghasilkan di %s/^@/ /glayar. ^@berarti karakter tunggal, tidak ^diikuti oleh @, jadi Anda tidak bisa mengetik ^dan @berturut-turut pada perintah di atas.

Perintah ini menggantikan semua ^@dengan karakter spasi.

( Sumber )

erik
sumber
Ketika Anda mengatakan "PC", maksud Anda Windows?
Sparhawk
1
CTRL-2 dan CTRL-SHIFT-2 hanya masuk akal pada tata letak keyboard di mana @ada di atas 2tombol.
Celada
@Sparhawk: Tidak, maksud saya pc linux. :-)
erik
Mengapa CTRL? Saya belum pernah melihat sistem di mana CTRL adalah kunci yang digunakan untuk berpindah di antara makna kunci yang berbeda. Itu biasanya SHIFT.
terdon
Sungguh aneh (mungkin bug di vim?), Tetapi berhasil. Biasanya harus ctrl + shift + 2 (di keyboard kita). Tanyakan sebagai pertanyaan terpisah atau tanyakan pengembang vim. Bagaimanapun jawaban Celada lebih umum untuk karakter kontrol.
erik