Шукайте та замінюйте контрольні символи (^ @, ^ M, ^ I ...) у vi


14

Я скопіював цей рядок з /proc/some_proc_id/cmdlineмоєї машини ubuntu,

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

Так чи інакше символи пробілу представлені символом ^@in vi. Я спробував замінити їх пробілами за допомогою команди,

:%s#^@# #g

Але він каже, pattern not found ^@.

Як можна замінити спеціальні символи, особливо ті, що починаються з символу карата?


Який тип терміналу ви використовуєте?
Ed Heal

часом, TERMі багато разів, цеscreen

Яку термінальну програму ви використовуєте та чи TERMправильно встановлена ​​змінна середовище?
Ed Heal

Відповіді:


15

Так чи інакше символи пробілу представлені символом ^@in vi.

Справа не в viтому. Хоча ви вводите командні рядки в оболонках з пробілами між аргументами, командні рядки - це фактично дискретні послідовності рядків всередині, а не одна довга пробіл, розділена пробілом. Оболонка відокремила командний рядок на окремі рядки аргументів до запуску команди.

У C рядки закінчуються символами NUL, і вони показані як ^@.

Як можна замінити спеціальні символи, особливо ті, що починаються з символу карата?

Для того, щоб ввести ці символи, ви повинні встановити їх префіксом Control- vдля буквального наступного символу.

Наприклад у цьому випадку: Control- vдалі Control- @.

Спеціальний символ, який вводить буквальні наступні символи, як правило, Control- vале він фактично може бути налаштований. Введіть, stty -aщоб дізнатися, для чого встановлено. Шукайте lnextу висновку.


повідомлення є інформативним .. але реальним рішенням мого питання є втеча з символу карата - :%s#^@##g. Оскільки я копіюю, вставляючи з терміналу, vi вставив їх як оригінальні символи ...

1
@MadhavanKumar Вам не уникнути символу каре, тому що немає ніякого символу каретки. Це дійсно фактичний контрольний персонаж. ^letterце лише візуальне позначення для цього, жодної реальної карети не стосується. І так, вам потрібно уникнути керуючого символу, Ctrl-V - це, як це зробити з клавіатури. Це працює найбільше скрізь. FYI, інша відповідь містить альтернативу, специфічну для viкомандного рядка, щоб уникнути необхідності вводити контрольний символ.
Селада

@MadhavanKumar Якщо ваш термінал відобразив символи NUL як двосимвольну рядок, ^@і ви скопіювали це, скопіюйте, \^@щоб представити цю дво символьну рядок у vi. Багато програмного забезпечення використовує зворотну косу рису, щоб означати "інтерпретувати наступний символ буквально замість використання його спеціальної функції".
Жиль "ТАК - перестань бути злим"

@Gilles, ти маєш рацію .. саме це я намагався передати Селаді ....

4

Цей символ являє собою символ NULL, значення ASCII 000.

Ви можете спробувати:

:%s/\%x00/ /g

Альтернатива:

На клавіатурі, де символ @ знаходиться над 2клавішею (спасибі Celada), ви можете:

  • %s/<CTRL-2>/ /g (на ПК)

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

де <CTRL-2>означає, що спочатку натисніть CTRLна ПК, зберігаючи його як натиснене, натисніть 2, відпустіть CTRL.

і <CTRL-SHIFT-2>означає, спочатку натисніть controlна Mac, зберігаючи його як натиснуто, натисніть shiftна Mac, зберігаючи його як натиснене, натисніть 2, відпустіть controlі shift.

Нарешті, %s/^@/ /gна екрані повинні вийти обидві команди . ^@означає один символ, ^за яким не слідує @, тож ви не можете просто вводити ^і @рядок у наведеній вище команді.

Ця команда замінює всі ^@символи пробілу.

( Джерело )


Коли ви говорите "ПК", ви маєте на увазі Windows?
Sparhawk

1
CTRL-2 та CTRL-SHIFT-2 мають сенс лише у розкладках клавіатури, де клавіша @вгорі 2клавіші.
Селада

@Sparhawk: Ні, я маю на увазі ПК з Linux. :-)
erik

Чому CTRL? Я ніколи не бачив системи, де CTRL - це ключ, який використовується для переходу між різним значенням ключа. Це зазвичай SHIFT.
terdon

Це дивно (може, помилка vim?), Але працює. Зазвичай це повинен бути ctrl + shift + 2 (на us-клавіатурі). Задайте це як окреме запитання або задайте розробникам vim. Так чи інакше, відповідь Селади є більш загальною для контрольних символів.
erik

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.