문제
10자가 위의 줄에서 처음 10 자와 특정 패턴과 일치하는 라인의 첫 10자를 어떻게 교체 할 수 있습니까?
편집 : 경기가 줄 내부에 나타날 수있는 첫 10자를 교체하라고 요청했는지는 확실하지 않았 으므로이 케이스를 처리하는 경우 답변에 메모를 할 수 있습니다 (이 케이스 B와 의도 한 사람에게 호출하십시오. 케이스 A?)
해결책
사전 랩 :
:%s/^\(.\{10}\)\(.*\n\)abcdefghij\(.*\)/\1\2\1\3/
여기서 'abcdefghij'는 2 라인의 10 문자열입니다.
다른 팁
이와 같은 것이 효과가 있습니다.
%s/^.\{10\}/\=strpart(get(getbufline("", line(".")-1), 0, ""), 0, 10)/
어디 ^.\{10\}
당신의 실제 패턴입니다.
%s/ # substitute all lines matching…
^.\{10\} # your pattern
/ # …with…
\= # an expression:
strpart( # gets the part of a string
get( # gets an element of a list
getbufline( # gets a list of lines from the current buffer
"", line(".")-1) # getbufline() the line before the current line
, 0, "") # get() first line in buffer, default to ""
, 0, 10) # strpart() first ten characters
/ # …end of substitution
:2,$g/<pattern>/s/^.\{10}/\=strpart(getline(line(".")-1),0,10)
2,$
우리의 범위입니다 (첫 번째 줄에는 이전 줄이 없기 때문에)g//
주어진 패턴과 일치하는 라인에서 명령을 실행할 수 있습니다.s/^.\{10}/
라인의 처음 10자를 대체합니다\=
VIM 표현의 결과를:s//
line(".")
현재 줄 번호입니다getline(line(".")-1)
이전 줄의 텍스트입니다strpart(getline(line(".")-1),0,10)
이전 줄의 첫 10 자입니다
예를 들어 2,$g/frog/s/^.\{10}/\=strpart(getline(line(".")-1),0,10)
바뀔 것이다:
나는 먹는 것을 좋아한다ing mangos 프라이 전에ing frogs legs 나는 내가 h를 바란다ad a puppy 그녀는 d를 주었다ad a frog
이에:
나는 먹는 것을 좋아한다ing mangos 나는 먹는 것을 좋아한다ing frogs legs 나는 내가 h를 바란다ad a puppy 나는 내가 h를 바란다ad a frog
이와 같은 복잡한 행동이 있으면 일반적으로 q
명령. (테스트되지 않은)와 같은 것 :
/<pattern>
qq
10x
k
10yl
j
P
n
q
그런 다음 거시적으로 반복적 인 문제 @q
선택적으로 카운트로 접두사.
검색 및 교체를 사용할 수 있습니다.
:7,9 s/foo/bar/c
이 예제는 7 행에서 9 행에서 'foo'가 발생할 때마다 검색하고 'bar'로 대체하여 각 히트에 대한 확인을 요청합니다. 확인하고 싶지 않다면 마지막에 C를 떨어 뜨립니다. 적합한대로 범위를 선택하면 원하는 곳으로 가져 가야합니다.
VIM의 움직임과 YANKING/PASTING 만 사용합니다. 파일 내용이 ..
1234567890abcdef
qwertyuiopasdfgh
Q의 커서와 함께 10x
, 파일이됩니다 :
1234567890abcdef
asdfgh
커서를 첫 번째 줄로 이동하십시오 (사용 k
그렇게 할 것입니다), 그렇게 할 것입니다 10yl
(Yank 10 캐릭터, 맞습니다)
그런 다음 한 줄 아래로 이동하고 j
, 그리고 붙여 넣기 P
(대문자, 커서 아래에 붙여 넣기) 파일이 다음과 같습니다.
1234567890abcdef
1234567890asdfgh
요컨대, Q의 커서부터 시작합니다.
10xk10yljP
.. 당신이 붙여 넣거나 할당 할 수있는 것 매크로에
덮어 쓰기로 붙여 넣을 분명한 단축키가 있다면 더 짧을 지 모르지만 그런 것을 찾을 수 없었습니다.
다른 옵션 중 하나는 엄청나게 모호한 regex 검색/교체입니다 ..
비주얼 라인 두 개의 대상 라인을 선택하고 다음 검색 및 재구점을 실행합니다.
:'<,'>s/\(\(.\{10\}\).*\)\n\(.\{10\}\)\(.*\)$/\1\r\2\4/
기본적으로 .. 잡아 ..
\1
- 전체 첫 줄\2
- 처음 10 자 (중첩 그룹)- 라인 브레이크
\3
- 2 행의 첫 10 자\4
- 나머지 두 번째 줄
그런 다음 두 줄을 구성합니다 \1\n\2\4
- First Line, Linebreak, 첫 번째 10 자, 나머지 2 초