vi를 사용하여 텍스트 파일의 각 줄 시작 부분에 특정 문자를 추가하는 방법

vi를 사용하여 텍스트 파일의 각 줄 시작 부분에 특정 문자를 추가하는 방법

다음 항목이 포함된 텍스트 파일이 있다고 가정합니다.

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/^/#/

이것은 vin을 사용하여 g모든 줄에 동일한 대체를 적용합니다.아니요^[[:blank:]]*$비어 있거나 공백만 포함된 표현식과 일치합니다 . 이 v명령은 ed편집기에서도 상속됩니다.

#또한 이미 로 시작하는 행에 추가하는 것을 피하고 #위 명령의 대체 항목을 로 변경하시겠습니까 s/^#\?/#/? 이것은 #비어 있지 않은 줄에 a를 삽입하지만바꾸다#(있는 경우) 로 시작합니다.

답변3

다음과 같이 할 수도 있습니다.

:%norm I#

각 행에 대해 al 모드 명령을 %적용하여 행 시작 부분에 문자를 삽입하고(선행 공백 무시) 문자를 입력합니다 .normI#

이 접근 방식의 이점은 일반 모드 명령의 모든 시퀀스를 적용할 수 있다는 것입니다. 를 사용하여 :g/pattern/norm I#일치하는 줄에 적용할 수 있다는 점에서 매크로와 다소 비슷합니다 pattern.

관련 정보