vi 모드의 명령줄: 모두 바꾸기

vi 모드의 명령줄: 모두 바꾸기

vi 모드의 명령줄에서 전역 대체를 수행하는 방법 접두사를 추가하여 ex 명령어를 사용할 수 없는 것 같은데 :어떻게 해야 하나요?

예를 들어, 명령의 모든 내용을 다음으로 바꾸려면 \.../

답변1

나는 사용할 것이다배쉬 히스토리 메커니즘:

$ echo 'foo\bar\baz'
foo\bar\baz
$ !!:gs/b/B/
echo 'foo\Bar\Baz'
foo\Bar\Baz

그러나 백슬래시를 다음으로 대체할 수 없는 것 같습니다.

$ echo 'foo\bar\baz'
foo\bar\baz
$ !!:gs/\\/\//
bash: :gs/\\/\//: substitution failed

답변2

vi 명령 모드에서

:1,$s+\\+/+g

그러면 모든 백슬래시 문자가 슬래시로 대체됩니다.`

답변3

vi이를 수행하는 방법은 여러 가지가 있습니다. 연설모두ex줄(":" 줄)에는 %또는 를 사용할 수 있습니다 1,$. 마찬가지로, 그것은 다른 것을 허용합니다구분 기호for s(대체 명령). 따라서 다음과 같이 변경할 수 있습니다.

:%s/\\/\//g
:%s,\\,/,g
:1,$s/\\/\//g
:1,$s,\\,/,g

요점은

  • 백슬래시는대체에 사용할 정규 표현식의 문자이며 다음과 같아야 합니다.탈출하다그걸 써,
  • 구분 기호는 구두점이어야 하며
  • 마지막으로 (첫 번째와 세 번째 예에서) 다음을 사용할 수 있습니다.구분 기호이전/이후 문자열의 일부로 사용되지만 이 경우에도 이스케이프되어야 합니다.

답변4

vi 내에서 \를 /로 전역적으로 바꾸는 데 문제가 있는 경우 첫 번째 문자는 특수 문자이므로 이스케이프해야 하고, 두 번째 문자는 일반적으로 sed 구분 기호로 선택되므로 역시 이스케이프해야 하기 때문입니다. 당신은 그것을 사용할 수 있습니다 :

:%!tr '\\' '/'

또는

:%s,\\,/,g

또는

:%s/\\/\//g

완전성을 위해 매크로 없이 일반 vi를 사용하고 ex 모드를 사용하지 않으려면 다음을 수행해야 합니다.

/\\
r/nr/nr/nr/nr/nr/nr/nr/nr/nr/nr/n

마지막 단계를 원하는 만큼 반복하세요. 전면 모드를 사용하지 않으려면 어떻게 해야 하는지 보여드리기 위해 포함시켰을 뿐입니다.

관련 정보