각 줄을 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.