파일에 영구적 인 줄 번호를 추가하는 방법은 무엇입니까?

다음과 같은 텍스트 파일이 있습니다 (Windows에서 gVim 사용).

foo bar baz quux corge grault garply waldo fred plugh [...150 more lines...] xyzzy thud 

파일의 각 줄에 숫자를 추가하고 싶습니다. :set number를 사용하지 않고 다음과 같이 각 줄 앞에 텍스트로 숫자를 추가하여 숫자가 파일의 일부가되도록합니다.

1. foo bar baz quux 2. corge grault garply 3. waldo fred plugh [...~150 more lines...] 155. xyzzy thud 

댓글

  • awk가이 작업을위한 도구 일 것입니다. 하지만 저는 ‘ Windows를 사용하고 있습니다 (한숨).
  • 여기 에서 이미 답변했습니다. 🙂
  • 아마 .. 아니면 더 일반적인가요?
  • ‘ 비슷하지만 저는 ‘ 영구적 인 줄 번호가 무엇인지 모릅니다. 두 번째로 다른 질문은 Windows의 gVim에 대한 모든 줄에 관한 것입니다 (답은 그렇습니다). 이것은 일반 vim에서만 한 단락에 대한 간단한 번호 매기기 목록입니다.
  • 글쎄요. id = “89061d7645”>

영구 ” ot는 버퍼가 수정되고 숫자가 없음을 나타냅니다. ‘ t 순전히 시각적 인 것 (당신과 동일). Windows에서 gvim을 지정하는 이유는cat또는nl와 같은 외부 유틸리티를 피하는 것입니다. = “3ab99f7668”> Windows에서는 일반적으로 사용할 수 없습니다 (OP가awk에 대한 의견에서 알 수 있듯이). 상위 두 가지 솔루션은 순수한 Vim입니다. 마지막으로 모든 라인 대 1 파라는 범위 선택의 문제입니다. 분명 큰 문제는 아닙니다.

답변

순수한 Vim 방식 :

:%s/^/\=line(".").". " 

설명 :

:%s/^/ " the substitution will be applied to the beginning of every line \= " the rest of the replacement part is an expression line(".").". " " the expression returns the current line number concatenated with a dot and a space 

:help \=:help line().

교체 부분에 표현식을 사용하는 것은 매우 강력하며 FWIW는 vimscript에 대한 진입 점입니다.

댓글

  • 이 매우 유용한 명령을 vimrc의 키맵에 어떻게 추가 할 수 있습니까?
  • 대체를위한 vim 도움말 항목을 보려면 : :help sub-replace-expression

답변

Vim 매크로의 한 가지 좋은 점은 재귀 할 수 있다는 것입니다. ) :

  1. 레지스터 q 삭제 : qqq
  2. 첫 번째 줄에 번호 추가 : ggI1. (공백을 잊지 마세요!)
  3. 줄의 시작으로 돌아가 매크로 기록 시작 : 0qq
  4. 번호 복사 :
  5. 줄 아래로 이동하여 번호 붙여 넣기 : +P
  6. 줄의 시작 부분으로 다시 이동 그리고 숫자를 늘립니다. 0<c-a>
  7. 줄의 시작 부분으로 다시 이동합니다 (그러면 매크로가 두 숫자가 될 때 끊어지지 않습니다!). 0
  8. 매크로를 한 번 호출하여 재귀 적으로 만듭니다. 이 시점에서 레지스터 q에는 여전히 아무것도 없으므로 @q는 아무 일도 일어나지 않습니다.
  9. 매크로 저장 : q
  10. 매크로를 한 번 더 호출하고 불꽃이 날아가는 것을 지켜보세요! : @@

매크로는 그런 다음 파일 끝에 도달 할 때까지 계속 자체 호출합니다.

다른 유사한 문제에 대해 재귀 매크로 트릭을 사용할 수 있으므로 “알아두면 좋은 문제입니다.

어떤 이유로 재귀 매크로를 사용하지 않으려면 1 단계와 8 단계를 생략하고 count 를 사용하여 매크로를 여러 번 실행할 수 있습니다. 100@q는 매크로 q를 100 번 실행합니다.

댓글

  • 강력한 것, 당신의 숙달에 절합니다. 매크로는 저에게 흑마 법과 같습니다 …
  • @ropata, 매크로는 (대부분) 일반 모드 명령의 시퀀스 일뿐입니다.
  • @romainl 제 생각에는 ‘을 키 입력 의 시퀀스로 생각하는 것이 좋습니다.
  • @Rich, ex 명령을 포함하여 여러 가지의 시퀀스가 될 수 있습니다.
  • @romainl 예, ‘이 ‘ 키 입력으로 생각하는 것이 가장 좋다고 생각하는 이유입니다. 키보드에 입력 한 내용 (예 : ex 명령 포함)을 모두 수동으로 입력 한 것처럼 정확하게 재생합니다.

답변

이러한 작업을 수행하기 위해 vim 전역 명령을 사용하고 싶습니다. 이것은 줄의 시작 부분에 반복을 추가하거나 텍스트의 기호를 수정하는 데 적용됩니다. 다른 솔루션보다 복잡해 보이지만 편리 할 때 사용할 수있는 매우 유연한 패턴이며 많은 생각없이 쉽게 수정할 수 있습니다.

먼저 범위를 선택하십시오. 이것을 적용하고 싶습니다). 나는 보통 마크 (예 :첫 번째 줄에 ma, 두 번째 줄에 mb를 입력합니다.하지만 줄 번호 나 시각적 선택을 사용할 수도 있습니다.) 다음 명령 (현재 사용 사례에 맞게 조정 됨)

:let i=1|"a,"bg/^/s/^/\=i.". "/|let i=i+1 

해체

:let i=1 

이렇게하면 시작 값으로 변수 i가 설정됩니다. 일반적으로 목록은 1로 시작하므로 i를 1로 설정합니다.

| 

바는 새 명령을 시작합니다.

"a,"b 

다음 명령의 범위를 설정합니다. 마크 a에서 마크 b로 이동합니다. , 목록의 첫 번째 줄과 마지막 줄에 설정됩니다.

g/^/ 

이것은 전역 명령입니다. 파일 (또는 범위)에서 주어진 정규식을 검색하고 일치하는 줄의 에서 나머지 명령 줄을 실행합니다. “줄 시작”을 검색하여 모든 줄을 일치시킵니다.

Item some txt other text Item second item whatever Item third 

와 같은 텍스트가 있고 이러한 레이블을 Item 다른 줄은 무시하고 대신 g/Item/ 또는 g/^Item/를 수행하십시오 (리터럴 항목 텍스트가 )

s/^/\=i.". "/ 

정규식을 실행하여 줄의 시작 부분을 다음과 연결된 i 값으로 바꿉니다. .. 일반적으로이 작업은 무엇이든 할 수 있습니다 (예 : Item 라벨을 숫자로 대체).

|let i=i+1 

바가 새 명령을 시작하더라도 전역이 완료된 후가 아니라 전역 명령 내에서 실행되도록 두 번째 명령을 설정합니다. 결과는 증가합니다. div id = “d0466aceaa”>

다음 줄이 g에 의해 처리되기 전입니다. 여기에 또 다른 유연성이 있습니다. i의 수정은 무엇이든 될 수 있습니다 (증가 피보나치 수열의 다음 요소를 생성하는 함수를 호출합니다.

Answer

모든 행

:%!nl -ba 또는 :%!cat -n 명령은 모든 줄에 줄 번호를 추가합니다.

Windows에서는 “Cygwin / MSYS / SUA를 설치해야합니다.

선택한 줄에 번호 추가

선택한 줄에만 번호를 추가하려면 다음에서 선택하십시오. 비주얼 모드 ( v 및 커서), 완료되면 다음 명령을 실행합니다. :%!nl (빈 줄 무시) 또는 :%!cat -n (빈 줄 포함).

서식

추가 공백을 제거하려면 시각적 블록에서 선택합니다 ( Ctrl + v ) 제거 ( x ).

일부 문자 추가 (., :, ) 번호 뒤의 숫자를 시각적 블록 ( Ctrl + v )에서 선택한 다음 문자 ( A )를 추가합니다. , 문자를 입력 한 다음 Esc )로 마칩니다.

설명

  • 주어진 것과 동일한 형식을 제공하지 않습니다. 질문에. 하지만 솔루션의 단순함이 마음에 듭니다.
  • @KarlYngveLerv å g 감사합니다. 답변에 포함했습니다.

답변

romainl의 답변 수정 :

:%s/^\(\d\+\. \)\?/\=line(".").". " 

이것은 줄 번호를 추가 하는 것이 아니라 기존에있는 줄 번호를 대체 합니다. 중간에 줄을 삽입하면 예상대로 모든 번호가 다시 매겨집니다.

이것은 숫자 다음에.를 추가하고 줄의 시작 부분에있는 공백을 새 숫자로 바꾸는 방식으로 작동합니다. . 이미이 패턴으로 시작하는 줄이 있으면 분명히 깨질 것이므로 생각을 가지고 사용하세요.

추가 된 부분 :

  • ^-줄 시작
  • \(-새 하위 그룹 시작
  • \d\+-숫자를 한 번 이상 일치
  • \. -점 일치 (.) 및 공백 .
  • \)-하위 그룹 종료
  • \?-그룹을 선택 사항으로 만들어이 줄에 아직 숫자가없는 경우 이전처럼 작동합니다.

보너스 힌트 :
줄 번호를 제거 하려면 repalce 부분이 비어있는 동일한 패턴을 사용할 수 있습니다.

:%s/^\(\d\+\. \)\?// 

Answer

I1. <esc>^qqyWjP^<C-a>q 

이것은 처음 두 줄에 번호를 매기 며 @q 다음 줄에 번호를 매기거나 ex. 18@q 총 20 줄을 작성하려는 경우).

설명 :

I1. <esc> Number the first line hqq Go back to the start of the line and start recording a macro yWjP Copy the line number to the next line ^<C-a> Increment the next line"s line number q Finish recording 

이것의 장점은 외부 명령이 필요하지 않다는 것입니다. 예를 들어 Windows에서 Vim으로 작업 할 수 있습니다.

댓글

  • 1. <esc>h를 입력하면 첫 번째 열이 아닌 두 번째 열입니다. h0로 바꾸고 나면 솔루션이 매우 좋을 것이라고 생각합니다.
  • @KarlYngveLerv å g 오타입니다. 감사합니다. 문제를 해결했습니다.
  • 문제 없습니다. 그러나 아직 설명을 업데이트하지 않았습니다. 또한 많은 키보드에서 ^^a -> â와 같은 입력 조합을 허용하기 위해 두 번째 문자를 기다립니다. 나는 여전히 최선의 해결책에 동의하지만 이것도 언급되어야한다고 생각합니다.

답변

나 선택한 답변이 최고라고 생각하지만 다양성을 염두에두고 외부 프로그램을 사용하여 대안을 제공하겠습니다.

:%!cat -n 

외부 프로그램 cat를 통한 버퍼 (%로 표시됨), 여기서 -n flag는 각 입력 줄 앞에 줄 번호를 붙입니다.

물론, 이것은 cat가 설치되어 있어야합니다. 이것은 (아마도) 모든 유닉스에 해당됩니다. 유사 시스템.

외부 프로그램을 통한 필터링에 대한 자세한 내용은 :help :range!를 확인하세요.

댓글

  • 요청자가 Windows에서 gVim을 사용하고 있다는 것을 알고 있으므로이 솔루션은 아마도 ‘에서 작동하지 않을 것입니다.하지만 여전히 다른 사람들에게 기회를 제공한다고 생각합니다. 티 o 여기서 배우십시오.
  • msysgit를 설치하고 PATH에 추가 한 경우 (IIRC it ‘ s 설치 옵션),이 솔루션은 Windows에서도 작동합니다.
  • cat -n 는 POSIX가 아니지만 nl 는 그렇기 때문에 더 나은 옵션입니다.

답변

약간 해킹적인 해결책은 다음과 같습니다 (< 및>는 Ctrl + v 를 누른 후 삽입됩니다.

:%normal :redir @"<Enter>:-=<Enter>:redir END<Enter>I<C-R>".<Tab><Esc>kdd 

해체

:%normal {commands} 

범위로 지정된 각 줄 (이 경우 모든 줄)에서 일반 모드 명령을 실행합니다.

:redir @" 

ex 명령에 의해 생성 된 모든 출력을 명명되지 않은 버퍼로 리디렉션합니다.

:.= 

는 현재 줄을 출력하는 ex 명령입니다. 번호 (안타깝게도 앞에 줄 바꿈이 있음)

:redir END 

이름이 지정되지 않은 버퍼로의 리디렉션을 중지합니다.

I<C-R>".<Tab><Esc> 

이름이 지정되지 않은 버퍼의 내용을. 탭을 각 줄의 맨 앞으로 이동하고 삽입 모드를 종료합니다.

kdd 

한 줄 위로 이동하고 :의 결과 인 줄 바꿈을 제거합니다. = 명령.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다