각 줄을 11 번 복사하여 각 줄의 마지막 "1"을 2-12에서 증가시키는 방법


9

파일에 여러 줄이 있고 각 줄을 11 번 복사하고 (각 줄을 12 줄로 변환) 각 줄의 마지막 "1"을 늘려서 12 줄이 "1"부터 " "1"이 원래 있던 12 ". 각 줄에 다른 "1"이있을 수 있지만, 증가시키고 싶은 "1"은 항상 각 줄에서 마지막으로 나타납니다. 또 다른 방법은 "/ nt / 1"에서와 같이 마지막 "1"이 항상 "/ nt /"뒤에 있다는 것입니다 (그리고 각 줄에서 항상 "/ nt / 1"만 발생 함) .

예를 들어 내가 가지고 있다면 :

1stlineblahblahblah/nt/1blah
2ndlineblahblahblah/nt/1blah
3rdlineblahblahblah/nt/1blah

나는 그것을 다음과 같이 바꾸고 싶다 :

1stlineblahblahblah/nt/1blah
1stlineblahblahblah/nt/2blah
1stlineblahblahblah/nt/3blah
1stlineblahblahblah/nt/4blah
1stlineblahblahblah/nt/5blah
1stlineblahblahblah/nt/6blah
1stlineblahblahblah/nt/7blah
1stlineblahblahblah/nt/8blah
1stlineblahblahblah/nt/9blah
1stlineblahblahblah/nt/10blah
1stlineblahblahblah/nt/11blah
1stlineblahblahblah/nt/12blah
2ndlineblahblahblah/nt/1blah
2ndlineblahblahblah/nt/2blah
2ndlineblahblahblah/nt/3blah
...

이전에 다음 명령을 찾았습니다.

:for i in range(0,12) | put ='1stlineblahblahblah/nt/'.i.'blah' | endfor

이 목적으로 작동하지만 각 줄에 대해이 명령을 수동으로 실행하고 각 줄을 직접 입력하거나 복사하여 붙여 넣어야합니다. 이미 파일에있는 줄을 가져 와서 내가 설명한 방식으로 각 줄을 12 개로 바꾸는 하나의 명령을 실행하는 방법이 있습니까?

이것을 도와 줄 수있는 사람에게 미리 감사드립니다. 나는 이것이 이것이 나의 두 번째 질문이라는 것을 알고 싶었고, 나는 가장 감사했던 첫 번째 질문에 대한 몇 가지 빠르고 효과적인 해결책을 얻게되어 기뻤습니다.

답변:


8

문제를 해결하는 대체 방법은 다음과 같습니다.

:%s/\(.*\)1\(.*\)/\=join(map(range(1, 12), 'submatch(1) . v:val . submatch(2)'), "\n")

대체는 "1"을 포함하는 각 행과 일치 하며 마지막 "1" {c1}전후 {c2}의 텍스트를 캡처합니다 . 일치하는 각 줄에 대해 1에서 12까지의 숫자 범위 {n}가 매핑 되어 12 개의 양식을 만듭니다 {c1}{n}{c2}. 12 개 라인의 각 그룹은 원래 일치하는 관련 라인을 대체합니다.

참조하십시오 :h sub-replace-expression.


2
와우, 훌륭한 한 줄 명령입니다. 몇 주 전에 내가 처음으로 물었던 질문에 대해 우아한 단선 솔루션을 찾았다는 것을 기억합니다. 아주 좋은 일입니다. 대단히 감사합니다. 또한 이것을 _vimrc 파일에 넣는 방법이 있다고 생각합니다. 위의 전체 줄을 입력하지 않고 (또는 이전 명령 목록을 스크롤하지 않고도) 기억하기 쉬운 명령 또는 함수를 실행할 수 있습니다. _vimrc 구문에 익숙하지 않아서 사용법을 알 수 없습니다.
— ablewasiereisawelba

10

당신은 이것을 할 수 있습니다

  1. 매크로를 기록한 다음
  2. globalex 명령을 사용하여 파일의 각 줄에 대해 매크로 n을 여러 번 실행 합니다.

매크로를 기록한 후에는 기록하는 동안 수행 된 변경 사항을 취소하거나 첫 번째 줄에는 n + 1 개의 추가 줄이 있고 연속적인 줄에는 n 이 있습니다.

매크로를 사용하여 a레지스터에 기록

qayyp$?\d<CR><C-A>q

다음 명령 을 레지스터 a( qa...q)에 기록합니다 .

  • yyp: 현재 줄을 복제
  • $: 줄의 끝으로 이동
  • ?\d<CR>: 한 자리 뒤로 검색
  • <C-A>: 커서 아래의 숫자를 1 씩 증가

매크로가 기록되면 실행 취소 ( uu)하거나 현재 줄 ( dd) 을 삭제하여 기록 중에 변경 한 내용을 제거하십시오 . 그런 다음 11전역 명령을 사용하여 파일의 각 줄에 대해 매크로 (또는 임의의 수)를 반복하십시오 .

:g//normal 11@a

2
효과가 있었다! 아주 좋아요 고맙습니다. 내가 Windows에서 GVIM을 사용하고 있기 때문에 대신 추가하려면 Ctrl-A 강조 모든 것을 처음 문제가 있었다 ...하지만 난 빠른 검색을했고,이 스레드를 발견 - stackoverflow.com/questions/289681/... - 어디 _vimrc에 nnoremap <kPlus> <Ca> nnoremap <kMinus> <Cx>를 넣는 제안을 사용하여 덧셈과 뺄셈에 "+"와 "-"키를 사용할 수 있습니다. 또한 전역 명령은 나를 위해 : g // normal 11 @ a 여야했지만 쉽게 이해할 수있었습니다. 감사합니다!
— ablewasiereisawelba

6

두 가지 방법:

매크로를 사용하십시오!

로 시작

1stlineblahblahblah/nt/1blah
2ndlineblahblahblah/nt/1blah
3rdlineblahblahblah/nt/1blah

첫 줄에 커서를두고

qqyyp$?\d<CR><Ctrl-a>q
10@q

어느 것이 :

qq q 레지스터에 매크로 기록 시작

yyp 현재 줄을 잡아 당겨 아래에 붙여 넣습니다.

$?\d<CR> 줄 끝으로 이동하여 거꾸로 보이는 첫 번째 숫자를 찾으십시오.

<Ctrl-a> 수 증가

q 매크로 기록을 중지하십시오.

이것은 당신을 떠난다 :

1stlineblahblahblah/nt/1blah
1stlineblahblahblah/nt/2blah
2ndlineblahblahblah/nt/2blah
2ndlineblahblahblah/nt/3blah

두 번째 줄에 커서를 놓습니다. 이 매크로를 원하는만큼 반복하십시오 (예 : 10 @ q로 10 번 반복). 각 라인에 대해이 프로세스를 자동화하려면 각 라인에서 전체적으로 프로세스를 실행하십시오.

:g//normal 11@q

또는 최신 버전의 vim을 사용하는 경우 : 원하는 행을 여러 번 붙여넣고 시각적 블록에서 증가시킬 숫자를 선택한 다음를 누릅니다 g <Ctrl-a>. 원하는대로 비주얼 블록의 모든 숫자를 증가시켜야합니다. 그러나 이것은 수동 프로세스입니다.


1
굉장한 g <c-a>방법 에 대해 몰랐 습니다. 공유해 주셔서 감사합니다.
— kba는 Monica

1
@fruglemonkey 답변의 첫 번째 부분은 위의 내용과 동일하지만 그럼에도 감사합니다. 두 번째 부분은, 내가 잘못한 것이 아니라면 나를 위해 작동하지 않는다고 생각하므로 올바른 버전을 사용해서는 안됩니다.
— ablewasiereisawelba

5

그런 일회성 작업에 매크로를 사용하는 것이 가장 쉽다는 것을 알았습니다. q+ 레지스터 이름으로 매크로 기록을 시작 하고 작업을 한 번 수행하십시오. 반복 가능한 작업이 하나 있습니다.

  • 선을 선택하십시오
  • 양키
  • 붙여 넣기 (다음 줄로 이동)
  • 줄의 끝으로 가다
  • 한 마디로 돌아가다
  • 1 씩 증가

이제 a일반 모드에서 등록하는 데 필요한 키 입력을 기록하십시오 .

qayyp$b<c-a>.

행을 다시 삭제하여 매크로를 11 번 실행하면 한 행에 올바른 결과가 나오는지 테스트하십시오.

11@a

그렇습니다! 다시 실행 취소하고 두 번째 매크로에서 전체 프로세스를 자동화하십시오 b.

qb11@aj

이제 @b파일 끝까지 실행할 수 있으며 원하는 출력을 생성해야합니다. 복잡하게 들리지만 일반적인 편집 패턴에 익숙해지면 실제로는 그렇지 않습니다.


내가 잘못하고 있는지 확실하지 않지만 작동하지 않는 것 같습니다. 나는 당신이 쓴 것을 따랐지만, 무언가를 잘못 이해했거나 제대로 실행하지 않았을 것입니다. (줄의 마지막 번호가 아니라 줄의 첫 번째 번호가 증가합니다.) 회신 해 주셔서 감사합니다.
— ablewasiereisawelba

3
첫 번째 매크로가되어야한다고 생각합니다 qaVyp$b<c-a>. 아니면 더 나은 qayyp$b<c-a>.
— Karl Yngve Lervåg

1
감사합니다, @ KarlYngveLervåg, 당신 말이 맞아요, 나는 매크로를 수정했습니다.
— KBA는 Monica

2
Argh : (@ ablewasiereisawelba를 철저히 작성해 주셔서 감사합니다. qqyyp$?\d<CR><Ctrl-a>q@fruglemonkey와 @jjaderberg 의 매크로 가 마지막 숫자를 검색 한 이후 더 낫습니다. 완전성을 위해 변경하겠습니다.
— kba는 Monica와

2
@kba 방금 누군가 내 질문에 대답하는 데 시간과 노력이 필요하다면 다른 사람에게서 이미 해결책을 찾았더라도 적어도 그의 해결책을 시도 할 수 있다고 생각했습니다. 노력해 주셔서 감사합니다. 기분이 나아지더라도 여전히 앞서 있습니다. :)
— ablewasiereisawelba

2

다음 매크로를 저장하고 각 줄에 사용하십시오.

qqyy11p/\/\zs1<CR><C-v>10jg<C-a>q

다른 답변과의 주요 차이점은 g<C-a>각 행을 다른 번호로 증가시키는 열 선택을 사용한다는 것입니다. :help v_g_CTRL-A자세한 내용을 확인 하십시오. 또한 \zs검색 후 숫자에서 커서가 멈추도록 패턴 시작 위치를 선택하는 데 사용 했습니다.

이 기능을 사용하려면 최신 버전의 Vim이 필요합니다.


1
@fruglemonkey도 제안했다 . 7.4.754 이후 아직 모든 배포판에 제공되지는 않았지만 (vim 표준에 따르면) 최신 기능이지만 멋진 기능입니다.
— kba는 Monica

죄송합니다
— Vitor

1
@Vitor 나는 단지 gVim 7.4를 가지고 있기 때문에 g<C-a>@fruglemonkey를 할 수 있다고 생각하지 않았지만 당신은 언급했지만 응답 해 주셔서 감사합니다. 나는 매크로를 시도 할 때- g<C-a>부분에 도달하기 직전에 블록 강조 표시되는 증분하려는 마지막 "1"문자가 아니라 첫 번째 "1"이전의 문자입니다. "블록 강조 표시되는 문자입니다. (또한, 나는 그것을 할 수있을 것이라고 생각 yy11p하고 10j내가 찾고 있어요 때문에, 매크로에 추가 - (12)의 총 11 개 라인)
— ablewasiereisawelba

1
의견을 보내 주셔서 감사합니다. 이에 따라 답변을 업데이트했습니다. 사용하기로 결정 \zs했지만 그냥 단순히 l이후를 추가 할 수 있습니다 <CR>.
— Vitor

1
vimrc에 정규 표현식 검색에 영향을주는 설정이있을 수 있습니다. 에서 Vim을 시작하여 다시 시도하십시오 vim -u NONE. 방금 완료했는데 완벽하게 작동합니다! 실제로, 선행 슬래시가 필요하기 때문에 검색이 처음 1과 일치하는 방법은 없습니다.
— Vitor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.