2009-09-21 2 views
25

약 1000 줄의 파일이 있습니다. 모든 줄은 가끔 줄을 제외하고 7 자리 숫자로 시작합니다. 나는이 줄들을 잡아야하고 실제로 그것들을 이전 줄과 조인해야한다.Vim이 7 자리 숫자로 시작하는 줄과 일치하도록하려면 어떻게해야합니까?

나는 다음과 같은 정규식 패턴을 사용하여 7 자리 숫자로 시작하는 행과 일치 할 수 있도록 관리했습니다

:

^\d\{7} 

나는 어떤 라인을 일치 얻을 수없는 것 그 이 패턴과 일치하지 않지만, 실제로 어떤 패턴인지 알 수 있습니다.

두 번째 질문으로이 질문에 포함 할 것입니다. 일치하는 줄을 가질 수 있습니까 (또는 내가하려고하는 것과 일관성을 유지하기 위해 일치하지 않음) 이전 줄에 자신을 조인 할 수 있습니까? (다음 줄을 가져 오는 J 명령과 반대입니다. 현재 하나)?

감사

답변

30
^\(\d\{7}\)\@! 

이것은 부정적 예측을위한 정력의 정규식 구문입니다.

당신이 대량 : 명령으로이 일을하는 경우

, 당신은 단지 원래의 표현을 반전합니다

:v/^\d\{7}/-1j 
+0

이상하게도, 둘 다 똑같은 결과를 낳습니다. 나에게 그것은 ^이없는 것이 실제로 작동한다는 것을 이해하지 못한다. 나는 그것에 대해 생각하지 않는다. –

+0

유일한 차이점은 시작 문자가 아닌 행의 다른 곳에 7 자리 숫자가있는 경우 ^가없는 문자가 일치한다는 것입니다. – chaos

+0

아, 그래 알겠습니다. 이 경우에는 없었기 때문에 여분의 줄을 수정하지 않아도됩니다 ... 적은 줄의 수가 정확히 같은 이유를 설명합니다. –

6

정규 표현식

^\(\d\{7}\)\@! 

을 할 수 있어야한다. 이 구문에 대한 추가 정보를 원하시면 여기를 참조 :

두 번째 문제에 관해서는
:help \@! 

, 당신은 예를 들어 아무것도 이전 라인에 후행 줄 바꿈을 대체 할 수 있습니다 : 여기

:%s/$\n^\(\d\{7}\)\@!//g 
+0

이것은 가까운 것이지만, 다른 답변의 결합은 함께 결합 된 줄 사이에 공백을 남겨 둡니다. 이 예제는 첫 번째 줄의 마지막 문자를 다음 줄의 첫 번째 문자 바로 앞에 놓습니다. 이것은 피할 필요가있는 부작용입니다. 그래도 대답은 +1하고 고맙습니다. –

+0

오 잘! 공백은 다음과 같이 추가 할 수 있습니다. : % s/$ \ n^\ \ (\ d \ {7} \\) \ @!// g – tobiasvl

+0

다른 하나는 더 짧지 만 나는 게으르다. P –

1

내 솔루션에서 사용하는 정력 내에서 호출 할 수있는, AWK :

$ cat seven.awk 
# Script to join lines that does not start with 7 digits 
/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ { print; next } 
{ printf $0; getline; print } 

$ cat seven.txt 
123 
4579 bad 
7654321 This line is OK 
1234567 OK So is this 
111 
2222 bad again 
4443333 OK again 

$ awk -f seven.awk seven.txt 
1234579 bad 
7654321 This line is OK 
1234567 OK So is this 
1112222 bad again 
4443333 OK again 

내 서투른 표현을 용서하십시오 : 내 AWK가 오래되어이 멋진 표현처럼 이해하지 않습니다 : \ D를 {7}. 당신은 전체 파일에 대한 정력 내부에서이 명령을 호출 할 경우 실제 답변을 지금

:%!awk -f seven.awk 
+0

원래 [0-9]도 7 번 있었다. gVim의 ex 편집자가 \ d {7} 단축키를 허용했음을 기쁘게 생각합니다. –

9

는 7 자리 숫자로 시작하지 않는 문자열과 일치하는 정규 표현식은 매우 간단합니다 :

.{0,6}([^0-9].*)? 

더 고전 정규식 해당 {}없이 구문은 실제로 더 읽기 : 그것은 시각적으로 무슨 일이 일어나고 있는지 우리에게 보여줍니다

(|.|..|...|....|.....|......)([^0-9].*)? 

e.e. 0과 6 사이의 문자를 사용할 수 있으며, 선택적으로 뒤에 오는 0이 아닌 추가 문자가 올 수 있습니다. 이렇게하면 7 자 이상의 문자가 일치하면 처음 7 자 중 적어도 하나가 비 연속 문자가됩니다.

가 빔에 선 일치하는이 번역하기 위해, 우리는 몇 가지 이스케이프와 고정 추가

^.\{0,6\}\([^0-9].*\)\?$ 

내가 \d을 "할"하지를; 그것은 너무 구식입니다. :)

+0

그건 그렇고, 마지막 줄을 썼을 때 손가락을 넘었고 같은 달에이 커밋을 만들었습니다. http://www.kylheku.com/cgit/txr/commit/?id=e63c7be49e144d2ed3967c28243109342e17dcaa – Kaz

관련 문제