Wyszukaj i zamień znaki kontrolne (^ @, ^ M, ^ I…) w vi


14

Skopiowałem ten wiersz z /proc/some_proc_id/cmdlinemojej maszyny Ubuntu,

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

W jakiś sposób znaki spacji są reprezentowane przez ^@w vi. Próbowałem zastąpić je spacjami za pomocą polecenia,

:%s#^@# #g

Ale to mówi pattern not found ^@.

Jak zastąpić znaki specjalne, zwłaszcza te rozpoczynające się symbolem karatowym?


Jakiego typu terminala używasz?
Ed Heal

czasami TERMi wiele razy tak jestscreen

Jakiego programu terminalowego używasz i czy TERMzmienna środowiskowa jest ustawiona poprawnie?
Ed Heal

Odpowiedzi:


15

W jakiś sposób znaki spacji są reprezentowane przez ^@w vi.

To nie vitak. Chociaż wpisujesz wiersze poleceń w powłokach ze spacjami między argumentami, wiersze poleceń są w rzeczywistości dyskretnymi sekwencjami ciągów wewnętrznych, a nie jednym długim ciągiem oddzielonym spacjami. Powłoka podzieliła wiersz poleceń na poszczególne ciągi argumentów przed uruchomieniem polecenia.

W C łańcuchy są zakończone znakami NUL i są pokazane jako ^@.

Jak zastąpić znaki specjalne, zwłaszcza te rozpoczynające się symbolem karatowym?

Aby wpisać te znaki, musisz poprzedzić je znakiem Control- vdosłownie następny znak.

Na przykład w tym przypadku: Control- va następnie Control- @.

Znak specjalny, który wprowadza dosłowne następne znaki, jest zwykle Control- vale w rzeczywistości można go konfigurować. Wpisz, stty -aaby dowiedzieć się, na co jest ustawiony. Poszukaj lnextw danych wyjściowych.


post ma charakter informacyjny ... ale prawdziwym rozwiązaniem mojego pytania jest uniknięcie symbolu karaty - :%s#^@##g. Odkąd skopiowałem, wkleiłem z terminala, vi

1
@MadhavanKumar Nie uciec symbol daszka, ponieważ nie jest żaden symbol daszka. To naprawdę postać kontrolna. ^letterjest po prostu zapisem wizualnym, bez udziału prawdziwej karetki. I tak, musisz uciec od znaku kontrolnego, Ctrl-V to sposób, w jaki to robisz z klawiatury. To działa najbardziej wszędzie. FYI, druga odpowiedź zawiera alternatywną, specyficzną dla vilinii poleceń, aby w ogóle uniknąć konieczności wpisywania znaku kontrolnego.
Celada,

@MadhavanKumar Jeśli twój terminal wyświetlał znaki NUL jako dwuznakowy ciąg ^@i skopiowałeś go, użyj \^@do reprezentowania tego dwuznakowego ciągu w vi. Wiele programów używa odwrotnego ukośnika, co oznacza „dosłownie interpretować następny znak, zamiast używać jego funkcji specjalnej”.
Gilles „SO- przestań być zły”

@Gilles, masz rację .. właśnie to starałem się przekazać

4

Ten symbol reprezentuje znak NULL o wartości ASCII 000.

Możesz spróbować:

:%s/\%x00/ /g

Alternatywny:

Na klawiaturze, na której symbol @ znajduje się nad 2klawiszem (dzięki Celada) możesz:

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

  • %s/<CTRL-SHIFT-2>/ /g (na Macu)

gdzie <CTRL-2>oznacza najpierw naciśnij CTRLkomputer PC, trzymając go tak, jak wciśnięty, naciśnij 2, zwolnij CTRL.

i <CTRL-SHIFT-2>oznacza, że ​​najpierw naciśnij controlkomputer Mac, trzymając go jak wciśnięty, naciśnij shiftkomputer Mac, trzymając go wciśnięty, naciśnij 2, zwolnij controli shift.

Wreszcie oba te polecenia powinny zostać %s/^@/ /gwyświetlone na ekranie. ^@Oznacza pojedynczy znak, nie ^następuje @, więc nie można po prostu wpisać ^i @z rzędu w powyższym poleceniu.

To polecenie zastępuje wszystkie ^@spacje.

( Źródło )


Kiedy mówisz „PC”, masz na myśli Windows?
Sparhawk,

1
CTRL-2 i CTRL-SHIFT-2 mają sens tylko w układach klawiatury, w których @jest on na górze 2klawisza.
Celada

@Sparhawk: Nie, mam na myśli komputer z systemem Linux. :-)
erik

Dlaczego CTRL? Nigdy nie widziałem systemu, w którym CTRL jest kluczem używanym do przechodzenia między różnymi znaczeniami klucza. Zwykle jest to SHIFT.
terdon

To dziwne (może błąd w vimie), ale działa. Zwykle powinna to być kombinacja klawiszy Ctrl + Shift + 2 (na klawiaturze US). Zadaj to jako osobne pytanie lub zadaj programistom vim. W każdym razie odpowiedź Celady jest bardziej ogólna dla postaci kontrolnych.
erik

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.