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