2012-08-01 4 views
2

저는 Vim에 익숙하지 않지만 커다란 텍스트 파일 (~ 1G)로 작업하고 있습니다. 표준 텍스트 편집기는 그것을 자르지 않았습니다.Vim에 세 번째 줄을 추가하는 방법은 무엇입니까?

내 파일 형식으로 현재 :

Arbitrary_title_of_sequenceA 
SEQ1SEQ1SEQ1SEQ1SEQ2SEQ2SEQ2SEQ2 
Arbitrary_title_of_sequenceB 
SEQ1SEQ1SEQ1SEQ1SEQ2SEQ2SEQ2SEQ2 

크기를 고려 :

Arbitrary_title_of_sequenceA 
SEQ1SEQ1SEQ1SEQ1 
SEQ2SEQ2SEQ2SEQ2 
Arbitrary_title_of_sequenceB 
SEQ1SEQ1SEQ1SEQ1 
SEQ2SEQ2SEQ2SEQ2 

내가 그렇게처럼 "SEQ1"라인에 "SEQ2"라인을 추가하는 편리한 방법이 필요합니다 이 파일들 중에서 각 행을 개별적으로 처리하는 것은 실제로 옵션이 아닙니다. 어떤 도움을 많이 주시면 감사하겠습니다!

답변

1
:1,$s/\(.*\n\)\(.*\)\n\(.*\n\)/\1\2\3/ 

1,$   -> range is all file 
s/PAT1/PAT2/ -> substitute PAT1 with PAT2 
.*   -> match any character except new line 
\n   -> match new line 
\(PAT1\)  -> capture/remember the string that matched PAT1 
\1,\2,\3  -> refers to the captured string for captures in order 

또한 빠르게 처리 될 수 대신 정력의 sed를 사용하여 : 무엇으로 시작하는 정확한 샘플을 제공 대해

Read a line 
Read another line and print previous line (n) 
Read another line and append it to the previous line (N) 
find the first newline and change it to space (s/\n/ /) 
print the line (or merged lines) 
+0

sed 명령은 다음과 같아야합니다 :'sed -i 'n; N; s/\ n //'input_file'. 's/\ n //'를 주목하라. 그래서 새롭게 결합 된 선들 사이에 공백을 두지 않는다. –

2

:

sed -i 'n;N;s/\n/ /' input_file 

이는 다음과 같이 요약 할 수있다?

:g/SEQ1/norm Jx 

내가 원하는을 생각 않습니다.

  • :g/SEQ1는 패턴 SEQ1을 포함하는 각 라인에 따라 행동 할 수 있도록 :global 명령입니다. :help :global을 참조하십시오.
  • norm:g/SEQ1과 일치하는 모든 행에 일반 모드 명령을 수행하는 데 사용하는 :normal 명령입니다. :help :normal을 참조하십시오. 그 후

는 문제의 일반 명령을 제공 : 아래의 라인과 현재 행을 결합하는 데 사용됩니다

  • J.
  • x은 Vim이 자동으로 추가 한 <Space>을 제거하는 데 사용됩니다.
+3

Vim 골프 시간 :': g/SEQ1/j!'. ': j'는 줄을 연결하기위한 ex 명령 인': join'의 약자입니다. '! '는': join'은 공백을 삽입하거나 삭제하지 않는다는 것을 의미합니다.자세한 내용은': h : j'를 참조하십시오. –

+2

': g/SEQ1/j! '외에도 패턴과 일치하기 쉬운 3 가지 종류의 줄에 따라': g/SEQ2/-j!'를 고려하십시오. 및': g/title/+ j! '. 이 세 명령은 대 체 또는 일반 모드 명령과 비교하여 가장 효율적입니다. –

+0

너희들 바위 야. 나의 초기 답변은 실제로'SEQ2'와 일치하는 것을 기반으로했지만,'SEQ1'과 일치하는 것이 더 효율적이라고 생각했습니다. – romainl

0

나는 라고 생각하면 신뢰할 수있는 "SEQ1"패턴을 가지고 있습니다. 말 그대로 모든 세 번째 줄에 가입하지 않으면, 당신은 쉽게 매크로를이 작업을 수행 할 수 있습니다 :

qqjJxjq 

파일에 얼마나 많은 라인을보고 그냥 여러 번 (이 아무튼하는 매크로를 반복 G 히트 그것은 당신이 필요 이상으로 중요하지 않음). 따라서 파일이 1000 줄이면 [email protected]을 할 수 있습니다. 이러한 종류의 솔루션은 기억하기 쉽고 정상적인 워크 플로우에 통합됩니다.

관련 문제