다음을 포함하는 파일이 있다고 가정해 보겠습니다.
xxx
yyy
zzz
그리고 다른 파일:
kkk
qqq
ppp
난 갖길 원해:
xxxkkk
yyyqqq
zzzppp
Vim에서 이를 달성하는 명령이 있나요? (저는 VISUAL BLOCK을 사용해 보았으나 성공하지 못했습니다.)
내 특별한 경우에는 붙여넣을 줄이 많은 두 개의 큰 파일이 있으므로 대답은 일부 셸 명령일 수도 있지만 동일한 파일에서 이 작업을 수행할 수 있는 방법이 있는지 궁금합니다.
답변1
명령줄에서 시도해 볼 수 있습니다.
paste -d '\0' file1 file2 > file3
이것이 바로 당신이 원하는 것입니다.
Visual Block 모드 vim
도 이 작업에 매우 적합합니다. 당신이 제대로 한 것이 확실합니까? 당신은해야
- 시각적 차단 모드로 전환
- 텍스트를 선택하고 눌러서
y
끌어당깁니다. - 데이터를 붙여넣으려는 왼쪽 상단 모서리(마지막 파일)의 다른 파일로 이동한
x
후 키를 누릅니다p
.
답변2
편집할 때 직접 해보세요 file1
. vim 에 :
전환하려는 내용을 입력하세요. command mode
그런 다음 다음을 입력하십시오.
%!paste -d '' - file2
답변3
Vim만 사용하여 동일한 파일에서 이를 수행하는 방법은 다음과 같습니다.
여기에는 일부 키 매핑이 포함됩니다. 간단한 텍스트로 여러 목록을 표 같은 구조로 정리하고 싶었을 때 이런 생각이 들었습니다.
이는 다음에 따라 달라집니다.}단락 경계를 건너뛰려면 키(오른쪽 중괄호)를 누르세요. (중괄호는 미러링됩니다. btw:{파일의 맨 위로 이동하여}끝까지. )
그래서... 이와 같은 데이터 파일이 있다고 가정합니다. (라인#이 다음과 같이 열려 있다고 가정합니다.:설정 뉴):
+---------------
| 1 xxx (cursor on line#1)
| 2 yyy
| 3 zzz
| 4
| 5 kkk
| 6 qqq
| 7 ppp
+---------------
중요한 것은 4번째 줄이 빈 줄(공백 없음)인데, 그 이유는 나중에 설명하겠습니다.
다음 명령을 실행하십시오.지도주문하다:
:map q mw}jdd'wpkJj
이는 "q" 키를 12자 프로그램에 바인딩합니다. 이에 대해서는 아래에서 자세히 설명하겠습니다.
"q"를 클릭하면 프로그램이 실행됩니다. 라인 1에서 시작하는 커서가 이제 다음 라인에 있으며 "q"를 다시 클릭할 준비가 되어 있는 것을 확인하세요. "xxx kkk" 사이에 공백 문자가 있다는 것을 눈치채셨을 것입니다. 이를 원하지 않으면 아래의 "추가 공백 문자는 어떻습니까?"를 참조하십시오.
+---------------
| 1 xxx kkk
| 2 yyy (cursor on line #2)
| 3 zzz
| 4
| 5 qqq
| 6 qqq
| ~
+---------------
매핑에 대한 분석은 다음과 같습니다.
:map q mw}jdd'wpkJj
^
콜론은 "map" 명령을 실행할 수 있도록 명령 모드로 전환합니다.
:map q mw}jdd'wpkJj
^^^^^
지도 Qq를 다음 문자 시퀀스에 바인딩합니다. "q"는 제가 자주 사용하는 "매핑 대상" 키입니다. 다른 키를 사용할 수도 있습니다. 기본 소문자 q는 매크로 기록을 시작하기 위해 매핑됩니다. 저는 거의(전혀?) 사용하지 않기 때문에 일회성 유틸리티 매크로에 "q"가 더 유용하다고 생각합니다. 대문자 Q(예: 지도 Q)나 fnct 키 등을 사용할 수도 있습니다.
이제 탐색 모드에서 "q"를 누를 때마다 vim은 다음과 같은 일련의 키 입력을 수행합니다.
mw}jdd'wpkJj
물론, 이것은 완전한 횡설수설처럼 보이기 때문에 무슨 일이 일어나고 있는지 더 쉽게 이해할 수 있도록 행동별로(아래 ^^을 사용하여) 분해하겠습니다.
mw}jdd'wpkJj
^^
이것메가와트이름이 지정된 위치를 표시합니다. 이 경우 이름은 "w"입니다. 기본값은 "w"(내 "작업 위치"라고 생각함)입니다.
커서를 이 줄로 되돌리려 는 경우 a-z까지 이름이 지정된 위치는 모두 가능합니다.
mw}jdd'wpkJj
^
여기에 올바른 컬이 있습니다.}커서를 다음 단락 경계로 이동합니다. 즉, 커서를 다음 빈 줄(이 예에서는 4번째 줄)로 이동합니다. (이것이 라인 4가 빈 라인이어야 하는 이유입니다. 공백이 없으면 안 됩니다.}경계로 간주되지 않습니다. )
mw}jdd'wpkJj
^
이것제이한 줄 아래로 이동하세요. 이것은 이전 vi "hjkl" 탐색입니다. 여기에서 아래쪽 화살표를 사용할 수도 있습니다. "j"는 읽기 쉽고 사용하기 쉽습니다(다양한 브랜드의 노트북과 데스크톱 키보드 사이에서 화살표 키가 항상 같은 위치에 있는 것은 아니지만 "hjkl" "은 QWERTY 키보드의 홈 행 오른쪽에 항상 있도록 보장됩니다(타자 속도에 도움이 됨).
이 시점에서 커서는 어쨌든 행 5에 있습니다.
+---------------
| 1 xxx
| 2 yyy
| 3 zzz
| 4
| 5 kkk (cursor on line#5)
| 6 qqq
| 7 ppp
+---------------
mw}jdd'wpkJj
^^
이것DD"줄 삭제" 편집 명령이므로 현재 줄, 즉 "kkk"가 포함된 5번째 줄을 삭제합니다. 라인을 삭제하면 기본 붙여넣기 버퍼에도 들어가게 되며, 이 공격을 사용하여 "kkk"를 라인 1의 "xxx" 옆에 원하는 위치로 다시 가져옵니다.
mw}jdd'wpkJj
^^
이것'와(작은따옴표 w) 시퀀스는 커서를 라인 1에 배치하는 "w"에 대한 책갈피로 다시 이동합니다.
mw}jdd'wpkJj
^
소문자 "p"는 현재 기본 버퍼(기억할 수 있는 "kkk" 포함)를 커서 뒤에 놓습니다. 버퍼에는 5행의 이전 내용이 포함되어 있으므로 이제 파일은 대략 다음과 같습니다.
+---------------
| 1 xxx
| 2 kkk (cursor on line#2, after the freshly restored "kkk")
| 3 yyy
| 4 zzz
| 5
| 6 qqq
| 7 ppp
+---------------
"kkk"가 어떻게 2번째 줄로 바뀌는지 주목하세요. (커서가 어디에 있는지 쉽게 알 수 없습니다. 실제로는 2번째 줄의 시작 부분에 있어야 합니다.)
우리는 가깝지만 아직은 거기까지 도달하지 못했습니다...
mw}jdd'wpkJj
^^
소문자케이커서를 라인 1로 이동하고("hjkl"을 다시 탐색) 대문자로 시작합니다.제이파일이 다음과 같이 보이도록 다음 줄을 현재 줄에 연결합니다(커서는 여전히 x와 k 사이의 1번 줄에 있습니다).
+---------------
| 1 xxx kkk (cursor on line #1, between 'xxx' and 'kkk')
| 2 yyy
| 3 zzz
| 4
| 5 qqq
| 6 ppp
+---------------
mw}jdd'wpkJj
^
마침내제이다시 "hjkl" 탐색은 커서를 라인 2로 이동합니다. 이는 우리가 적용하려는 다음 라인이기 때문에 편리합니다.큐도착하다.
어쨌든 다음과 같습니다.
+---------------
| 1 xxx kkk
| 2 yyy (cursor on #2)
| 3 zzz
| 4
| 5 qqq
| 6 ppp
+---------------
"q"를 다시 클릭하면 다음과 같이 표시됩니다(커서는 3행에 있음).
+---------------
| 1 xxx kkk
| 2 yyy qqq
| 3 zzz (cursor on #3)
| 4
| 5 ppp
+---------------
필요에 따라 헹구고 반복하십시오. 나는 이 방법을 사용하면 열을 (상당히) 쉽게 만들 수 있으므로 긴 목록에 편리하다고 생각합니다.
다음은 더 긴 예입니다. 행 7에 빈 행을 추가하면 "ggg"가 다음 열에 먼저 쌓이게 됩니다. "llll"에 도달하면 커서를 다시 라인 1(왼쪽 컬, {, 잘 작동함)로 이동하고 "mmm"을 계속 입력합니다. 배열 방식이 마음에 들지 않으면 길게 누르세요.너(실행 취소) 약간 "테두리" 선의 위치를 조정하고 다시 시작합니다.
이것은 설명하려고 애쓰는 것보다 달성하기 더 쉬운 것입니다. 수천 개의 행을 연결하는 데 이 방법을 사용할 것이라고는 생각하지 않지만 수십 또는 수백 개의 행을 연결하는 데는 유용하다고 생각합니다.
+----------:---------------------------
| before : after
+----------:---------------------------
| 1 aaa : 1 aaa ggg mmm sss yyy
| 2 bbb : 2 bbb hhh nnn ttt zzz
| 3 ccc : 3 ccc iii ooo uuu
| 4 ddd : 4 ddd jjj ppp vvv
| 5 eee : 5 eee kkk qqq www
| 6 fff : 6 fff lll rrr xxx
| 7 :-------------------------
| 8 ggg
| 9 hhh
| 10 iii
| 11 jjj
| 12 kkk
| 13 lll
| 14 mmm
| 15 nnn
| 16 ooo
| 17 ppp
| 18 qqq
| 19 rrr
| 20 sss
| 21 ttt
| 22 uuu
| 23 vvv
| 24 www
| 25 xxx
| 26 yyy
| 27 zzz
+----------
추가 공백 문자는 어떻습니까?
연결 명령의 동작 중 일부는 연결된 줄 사이에 공백을 두는 것입니다.
그렇지 않으면생각하다"xxx kkk" 사이에 공백이 있으면
삭제 명령(x)을 문자열에 추가할 수 있습니다.
simple join (space char): :map q mw}jdd'wpkJj
join + x (kills space): :map q mw}jdd'wpkJxj
join w/comma: :map q mw}jdd'wpkJR,^[j
다음을 사용하여 "결합 + x"엑스두 선을 연결한 직후입니다. 엑스탐색 모드에서는 커서가 있는 모든 문자(이 경우 문제가 되는 공백 문자)를 삭제합니다.
"쉼표로 결합"은 공백을 쉼표로 바꿉니다. 이는 기본적으로 동일하지만 이전 예제와 약간 다른 마지막 부분을 살펴보겠습니다.
:map q mw}jdd'wpkJR,^[j
^
이것오른쪽편집 모드(특히 교체 모드)로 들어가겠습니다.씌우다우리가 입력하는 모든 문자).
:map q mw}jdd'wpkJR,^[j
^
이것,해당 지점에서 문제가 있는 공간을 가리는 쉼표를 문자 그대로 입력합니다.
:map q mw}jdd'wpkJR,^[j
^^
그런 다음^[편집 모드를 종료하고 탐색 모드로 돌아가는 이스케이프 문자를 신호로 보냅니다.
이제 결승전 준비가 끝났습니다제이다음 줄로 가세요.
이스케이프 문자를 매핑하려면 ^Q(windows) 또는 ^V(linux & unix)를 누른 다음 Esc 키를 눌러야 합니다(이렇게 하지 않으면 Esc 문자가 명령을 중단하고 이유가 궁금할 것입니다). 매핑이 복잡할 수 있으며 정의가 사라집니다. 다음은 Windows에서 Vim에 입력하기 위해 입력해야 하는 순서입니다.
:map q mw}jdd'wpkJR,<Ctr-Q><Esc>j
그래서. Vim에서 이를 수행하는 방법은 아마도 수십 가지가 있을 것입니다.
"필드" 구분 기호가 중요한 경우 일반적으로 각 행의 끝에 간단한 고유 시퀀스를 배치하고 전역 검색 및 바꾸기를 수행하고 원하는 방식으로 열을 계속 연결한 다음 원하는 것을 얻기 위해 모두 바꿉니다. .
어쨌든 이것은 단지 예일뿐입니다. 이 내용이 흥미로웠기를 바랍니다.