Поиск и замена управляющих символов (^ @, ^ M, ^ I…) в vi

14

Я скопировал эту строку из /proc/some_proc_id/cmdlineмоей машины с Ubuntu,

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

Каким-то образом символы пробела представлены ^@в vi. Я попытался заменить их пробелами, используя команду,

:%s#^@# #g

Но это говорит pattern not found ^@.

Как можно заменить специальные символы, особенно те, которые начинаются с символа карата?

Жиль "ТАК - перестань быть злым"
источник
Какой тип терминала вы используете?
Эд Хил
время от времени, TERMи много раз, этоscreen
Какую терминальную программу вы используете и TERMправильно ли установлена ​​переменная окружения?
Эд Хил

Ответы:

15

Каким-то образом символы пространства представлены ^@ в vi.

Это не vi то, что сделал это. Хотя вы вводите командные строки в оболочках с пробелами между аргументами, командные строки на самом деле являются внутренними дискретными последовательностями строк, а не одной длинной строкой, разделенной пробелами. Оболочка разделяла командную строку на отдельные строки аргументов до запуска команды.

В C строки заканчиваются символами NUL, и они отображаются как ^@ .

Как можно заменить специальные символы, особенно те, которые начинаются с символа карата?

Для того, чтобы ввести эти символы, вы должны поставить перед ними префикс Control - vдля буквального следующего символа.

Например, в этом случае: Control- с vпоследующимControl - @.

Специальный символ, который вводит буквально следующие символы, обычно Control- vно это на самом деле настраивается. Тип, stty -aчтобы узнать, что он установлен. Ищите lnextв выходных.

Celada
источник
пост информативен ... но реальное решение моего вопроса - избежать символа карата - :%s#^@##g. Поскольку я копирую, вставляю из терминала, vi вставляет их как оригинальные символы ...
1
@MadhavanKumar Вам не избежать символа каре, потому что нет никакого символа каретки. Это действительно настоящий персонаж управления. ^letterэто просто визуальная запись для этого, никакой реальной каретой не занимается. И да, вы должны экранировать управляющий символ, Ctrl-V - это то, как вы делаете это с клавиатуры. Это работает почти везде. К вашему сведению, другой ответ содержит альтернативу, специфичную для viкомандной строки, чтобы вообще не вводить управляющий символ.
Селада
@MadhavanKumar Если ваш терминал отображал символы NUL в виде двухсимвольной строки, ^@и вы скопировали ее, затем используйте \^@для представления этой двухсимвольной строки в vi. Многие программы используют обратную косую черту в значении «интерпретировать следующий символ буквально вместо использования его специальной функции».
Жиль "ТАК - перестань быть злым"
@ Жиль, ты прав ... это то, что я пытался донести до Селады ....
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на экране. ^@означает один символ, ^за которым не следует @, поэтому вы не можете просто набрать ^и @подряд в приведенной выше команде.

Эта команда заменяет все ^@символы пробела.

( Источник )

Erik
источник
Когда вы говорите «ПК», вы имеете в виду Windows?
Sparhawk
1
CTRL-2 и CTRL-SHIFT-2 имеют смысл только на раскладках клавиатуры, где клавиша @находится сверху 2клавиши.
Селада
@ Sparhawk: Нет, я имею в виду ПК с Linux. :-)
Эрик
Почему CTRL? Я никогда не видел системы, где CTRL - это ключ, используемый для переключения между различными значениями ключа. Это нормально SHIFT.
Terdon
Это странно (может быть, ошибка в Vim?), Но это работает. Обычно это должен быть ctrl + shift + 2 (на клавиатуре us). Задайте это как отдельный вопрос или спросите разработчиков vim. В любом случае, ответ Селады более общий для управляющих персонажей.
Эрик