![Vim을 사용하여 텍스트 파일을 자르는 방법](https://linux55.com/image/107462/Vim%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%85%8D%EC%8A%A4%ED%8A%B8%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%9E%90%EB%A5%B4%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
vim을 사용하여 텍스트 파일을 자르는 방법은 무엇입니까? 예를 들어, 파일을 위치 56으로 자르고 싶습니다. 따라서 위치 1-56의 모든 내용을 유지하고 위치 57(포함)부터 각 줄 끝까지의 모든 내용을 삭제하고 싶습니다.
텍스트 파일:
Web Application - http://sharepoint
Url CompatibilityLevel
--- ------------------
http://sharepoint 15
http://sharepoint/sites/appcatalog 15
http://sharepoint/sites/devtest 15
http://sharepoint/sites/publishing 15
awk를 사용하면 내가 원하는 것을 어느 정도 얻을 수 있습니다.
$awk '{print $1}' file
결과:
Web
Url
---
http://sharepoint
http://sharepoint/sites/appcatalog
http://sharepoint/sites/devtest
http://sharepoint/sites/publishing
그런데 따지고 싶다고 하면 꼭 타이틀을 유지하고 싶다. vim을 사용하여 이 파일을 기술적으로 56 위치로 자르려면 어떻게 해야 합니까? 바람직하게는 vim에서. vim에서 파일을 열었다는 의미입니다.
답변1
이를 수행하는 방법에는 여러 가지가 있으며, 그 중 일부는 다음과 같습니다.
:%s/\%>56c.//g
:%s/\%57c.*//
:%s/\v^.{56}\zs.*//
:% normal 57|D
(이 가설virtualedit=all
또는virtualedit=onemore
)- Shift-g
57
|Ctrl-v1Shift-gEndx(이 가정virtualedit=all
)
편집하다:요청에 따라 매뉴얼에서 관련 역류를 추가했습니다.
- 1.과 2. (
:h /\%c
)의 경우:\%23c
특정 열을 일치시킵니다.
\%<23c
특정 열을 일치시키기 전에.
\%>23c
특정 열을 일치시킨 후.
이 세 가지를 사용하여 버퍼나 문자열의 특정 열을 일치시킬 수 있습니다. "23"은 임의의 열 번호일 수 있습니다. 첫 번째 열은 1입니다. 실제로 열은 바이트 수입니다(따라서 멀티바이트 문자의 경우 정확하지 않습니다). - 3.(
:h \zs
)의 경우:\zs
어디에서나 일치하고 일치 시작을 설정합니다. 다음 문자는 전체 일치의 첫 번째 문자입니다. 4.(
:h |
,:h D
,:h :normal
,:h :%
,:h 'virtualedit'
)의 경우:|
현재 행의 열 [개수]를 필터링합니다. 독점 모션. 시시는 파이프가 아니다["x]D
줄 끝까지 커서 아래의 문자를 삭제한 다음 [count]-1 줄을 [레지스터 x로] 삭제합니다. "d$"의 동의어입니다.:norm[al][!] {commands}
일반 모드 명령 {commands}을 실행합니다. 이를 통해 명령줄에 입력된 일반 모드 명령을 실행할 수 있습니다. {commands}는 입력한 것처럼 실행됩니다.%
같음1,$
(전체 파일)'virtualedit'
쉼표로 구분된 단어 목록:
block
시각적 블록 모드에서 가상 편집이 가능합니다.
insert
삽입 모드에서 가상 편집을 허용합니다.
all
모든 모드에서 가상 편집이 가능합니다.
onemore
커서가 줄 끝을 지나 이동하도록 허용가상 편집이란 실제 문자가 없는 곳에 커서를 위치시킬 수 있다는 의미입니다. 이는 탭 중간이나 줄 끝 너머에 있을 수 있습니다. 시각적 모드에서 직사각형을 선택하고 테이블을 편집하는 데 유용합니다.
5.(
:h G
,:h CTRL-V
,:h <End>
,:h x
)의 경우:G
기본값이 마지막 줄인 [count] 줄로 이동하여 공백이 아닌 첫 번째 문자를 한 줄씩 찾습니다.[count]CTRL-V
블록별로 시각적 모드를 시작합니다.$
아니면<End>
줄 끝까지.["x]x
커서 아래와 뒤의 [count] 문자를 [x를 등록하기 위해] 삭제합니다(한 줄씩 삭제하지 않음). "dl"과 동일합니다.
답변2
"위치"가 "열"을 참조한다고 가정하면 정규식을 사용할 수 있습니다
:%s/^\v(.{56}).*/\1/
^
이는 Perl( \v
마법)이 줄의 시작 부분부터 시작하여 .
56번 일치하고 해당 내용(괄호)을 저장하여 .*
줄의 나머지 부분과 일치하도록 대체한다는 의미입니다 \1
.
awk
어떤 이유로 필터가 불법이 아닌 이상 more 또는 less 를 호출할 수도 있습니다 .
:%!awk '{print $1}'
답변3
vim에서 {print $1}
헤더를 제외한 모든 것을 얻으려면 다음을 시도하십시오.
:2,$s/ .*//