다음 항목이 포함된 텍스트 파일이 있다고 가정합니다.
my name is XYZ
I study at ABC school
vi 모드를 사용하는 경우 각 줄 앞에 "#"을 추가하고 싶습니다
:%s/^/#/g
. 문제는 "#"이 텍스트 파일의 빈 줄에도 삽입되지만 비어 있지 않은 줄 앞에만 "#"을 추가하고 싶다는 것입니다. 윤곽.
답변1
노력하다
:%s/^./#&/
어디
:
명령 모드%
모든 라인s/LHS/RHS/
왼쪽을 오른쪽으로 교체^
if 라인 시작.
캐릭터#
&
우리가 찾은 것
답변2
#
"빈" 줄, 즉 비어 있거나 공백이나 탭만 포함된 줄의 시작 부분에 추가하는 것을 피하고 싶다고 가정합니다 .
#
공백이 아닌 문자를 포함하는 각 줄의 시작 부분에 삽입하십시오.
:g/[^[:blank:]]/ s/^/#/
이는 g
편집기에서 상속된 ("전역") 명령을 사용하여 ed
정규식과 일치하는 모든 줄에 대체 항목을 적용합니다 [^[:blank:]]
. 이 표현식은 공백이 아닌 문자가 하나 이상 포함된 행과 일치합니다. "공백 문자"(POSIX 로케일)는 탭 문자 또는 공백입니다.
같은 효과를 내는 명령:
:v/^[[:blank:]]*$/ s/^/#/
이것은 v
in을 사용하여 g
모든 줄에 동일한 대체를 적용합니다.아니요^[[:blank:]]*$
비어 있거나 공백만 포함된 표현식과 일치합니다 . 이 v
명령은 ed
편집기에서도 상속됩니다.
#
또한 이미 로 시작하는 행에 추가하는 것을 피하고 #
위 명령의 대체 항목을 로 변경하시겠습니까 s/^#\?/#/
? 이것은 #
비어 있지 않은 줄에 a를 삽입하지만바꾸다#
(있는 경우) 로 시작합니다.
답변3
다음과 같이 할 수도 있습니다.
:%norm I#
각 행에 대해 al 모드 명령을 %
적용하여 행 시작 부분에 문자를 삽입하고(선행 공백 무시) 문자를 입력합니다 .norm
I
#
이 접근 방식의 이점은 일반 모드 명령의 모든 시퀀스를 적용할 수 있다는 것입니다. 를 사용하여 :g/pattern/norm I#
일치하는 줄에 적용할 수 있다는 점에서 매크로와 다소 비슷합니다 pattern
.