vi에서 제어 문자 (^ @, ^ M, ^ I…) 검색 및 바꾸기


14

/proc/some_proc_id/cmdline우분투 컴퓨터 에서이 줄을 복사했습니다 .

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

어떻게 든 공백 문자는 ^@vi 로 표시됩니다 . 명령을 사용하여 공백 문자로 바꾸려고했습니다.

:%s#^@# #g

그러나 그것은 말합니다 pattern not found ^@.

캐럿 기호로 시작하는 특수 문자를 어떻게 특수 문자로 대체 할 수 있습니까?


사용중인 터미널 유형은 무엇입니까?
Ed Heal

때때로, TERM그리고 여러 번screen

사용중인 터미널 프로그램은 무엇이며 TERM환경 변수가 올바르게 설정되어 있습니까?
Ed Heal

답변:


15

어떻게 든 공백 문자는 ^@vi 로 표시됩니다 .

그렇지 않아 vi그 행한. 인수 사이에 공백이있는 쉘에 명령 행을 입력하더라도 명령 행은 실제로는 공백으로 구분 된 하나의 문자열이 아니라 내부적으로 이산적인 문자열 시퀀스입니다. 쉘은 명령이 시작되기 전에 명령 행을 개별 인수 문자열로 분리했습니다.

C에서 문자열은 NUL 문자로 끝나고로 표시됩니다 ^@.

캐럿 기호로 시작하는 특수 문자를 어떻게 특수 문자로 대체 할 수 있습니까?

해당 문자를 입력하려면 리터럴 다음 문자의 앞에 Control- v를 붙여야합니다 .

이 경우 예를 들면 : Control- v다음 Control- @.

리터럴 다음 문자를 소개하는 특수 문자는 일반적으로 Control-v 하지만 실제로 구성 할 수 있습니다. stty -a설정 한 내용을 찾으려면 입력하십시오 . lnext출력에서 찾으십시오 .


게시물은 유익합니다 .. 그러나 내 질문에 대한 실제 해결책은 캐럿 기호-를 이스케이프 처리하는 것 :%s#^@##g입니다. 터미널에서 붙여 넣기 한 후 복사 한 vi는 원래 문자로 붙여 넣었습니다.

1
이 때문에 @MadhavanKumar 당신은 캐럿 기호를 탈출하지 않습니다 더 캐럿 기호. 실제로 실제 제어 캐릭터입니다. ^letter단지 시각적 인 표기법이며 실제 캐럿은 포함되지 않습니다. 그리고 네, 제어 문자를 피해야합니다 .Ctrl-V는 키보드에서 그렇게합니다. 그것은 모든 곳에서 가장 효과적입니다. 참고로, 다른 답변에는 vi제어 문자를 전혀 입력하지 않아도되도록 명령 줄과 관련된 대안이 포함되어 있습니다 .
Celada

@MadhavanKumar 터미널이 NUL 문자를 2 자 문자열로 표시하고 ^@복사하여 붙여 넣은 경우 \^@vi에서 해당 2 자 문자열을 나타내는 데 사용하십시오 . 많은 소프트웨어가 백 슬래시를 사용하여 "특수 기능 대신 문자 그대로 다음 문자 해석"을 의미합니다.
Gilles 'SO- 악마 그만해'

@Gilles, 당신 말이 맞아 .. 내가 Celada에 전달하려고 한 것입니다 ....

4

기호 는 ASCII 값이 000 인 NULL 문자를 나타냅니다.

시도해 볼 수 있습니다 :

:%s/\%x00/ /g

대안 :

@ 기호가 2키 위에있는 키보드 (Celada 덕분에)에서 다음을 수행 할 수 있습니다.

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

  • %s/<CTRL-SHIFT-2>/ /g (Mac에서는)

여기서 <CTRL-2>다운 수단을 누르는 CTRL누름 히트로 유지 PC에 2릴리스 CTRL.

<CTRL-SHIFT-2>수단 첫째 눌러 아래로 control아래로 눌러 누름으로, Mac에서 그것을 유지 shift눌려 히트로 유지, 맥 2, 출시 controlshift.

마지막으로 두 명령 모두 %s/^@/ /g화면에 나타납니다. ^@^뒤에 하나가 아닌 단일 문자를 의미 @하므로 위 명령에서 입력 ^하고 @한 행으로 만 할 수는 없습니다 .

이 명령은 모든 ^@공백 문자로 바꿉니다 .

( 소스 )


"PC"라고 말하면 Windows를 의미합니까?
Sparhawk

1
CTRL-2 및 CTRL-SHIFT-2 @2키 가 위에 있는 키보드 레이아웃에서만 의미가 있습니다 .
Celada

@Sparhawk : 아니요, Linux PC를 의미합니다. :-)
erik

왜 CTRL인가? CTRL이 키의 다른 의미 사이를 전환하는 데 사용되는 시스템을 본 적이 없습니다. 일반적으로 SHIFT입니다.
terdon

그것은 이상하지만 (vim의 버그 일 수 있습니까?) 작동합니다. 일반적으로 ctrl + shift + 2 (us-keyboard) 여야합니다. 별도의 질문으로 요청하거나 vim 개발자에게 문의하십시오. 어쨌든 Celada의 대답은 제어 문자에 더 일반적입니다.
erik

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.