vi를 사용하여 파일의 모든 줄을 어떻게 삭제합니까?


269

vi를 사용하여 파일의 모든 줄을 어떻게 삭제합니까?

현재 나는 파일의 모든 줄을 제거하기 위해 다음과 같은 것을 사용합니다.

echo > test.txt

vi?를 사용하여 모든 줄을 어떻게 삭제할 수 있습니까?

참고 : 사용 dd은 좋은 옵션이 아닙니다. 여러 줄이있을 수 있습니다.


5
dG가 작동해야한다고 생각합니다.
MadTux

11
@MadTux, 첫 줄에서 시작하는 경우에만. 1GdG어디서나 작동합니다.
Holloway

1
echo | test.txttest.txt실행 가능한 스크립트 가 아닌 한 유효한 명령이 아닙니다 . 당신이 echo >test.txt대신 의미 하는 것 같아요 ?
tripleee

당신은 맞습니다 @tripleee
Cold

5
유의 하지 사용하여 vi, >test.txt제로 (0)의 길이로 절단하기에 충분 - 아니 echo필요합니다.
abligh

답변:


473

에서 vi할 일

:1,$d

모든 줄을 삭제합니다.

:명령 이 도입되고 커서가 맨 아래로 이동합니다.
1,$다음 명령 (어떤 라인의 표시이다 d)에서 작동한다. 이 경우 1 행에서 마지막 행까지의 범위 (로 표시 $되므로 문서의 행 수를 알 필요가 없습니다).
마지막 d은 표시된 줄을 삭제합니다.

짧은 형식 ( :%d)이 있지만 사용하지 않는 것이 좋습니다. (가) :1,$d더 쉽게 할 수있다 "적응"예하는 :4,$-2d나머지 부분을 삭제, 첫 번째 3 개 마지막 두 줄을 떠나.


9
프로 팁. 더 이상ESC+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd...
rdev5

2
@ rdev5 .다음에 명령을 반복 하려고 시도
Gazihan Alankus

169

vi에서는

:%d

어디

  • : vi에게 명령 모드로 이동하도록 지시합니다.
  • % 모든 라인을 의미
  • d : 삭제

명령 행에서

> test.txt

또한 할 것입니다.

dd의 문제점은 무엇입니까?

dd if=/dev/null of=test.txt

어디

  • /dev/null 특수한 0 바이트 파일입니다
  • if 입력 파일입니다
  • of 출력 파일입니다

dd파일을 사용할 때마다 줄마다 오줌이 필요하다고 생각했습니다 .
Cold

좋은. 예상했던 것보다 훨씬 간단합니다.
Cold

11
ddvi 명령 (OP가 의미 함)과 dd유틸리티 를 구별해야합니다 . 또한 > test.txt비 -bash 쉘 (예 : zsh)에서는 예상대로 작동하지 않을 수 있습니다.
depquid

1
@depquid Oups! 지금 나는 그것을 생각하게되었다 ...
Archemar

2
또는 : >test.txt아주 조금 더 길다.
tripleee

53

POSIX 호환 쉘에서 작동해야합니다.

> test.txt

vi로 정말로하고 싶다면 다음을 수행하십시오.

  • 1G (첫 줄로 이동)
  • dG (마지막 줄로 삭제)

30
@Cold : ... 한 번?
Chris Down

5
G마지막 줄을 나타냅니다. 첫 번째 줄 ( gg) 에있는 경우 dGvi에 현재 줄 (첫 번째 줄)에서 마지막 줄까지 모든 줄을 제거하도록 지시합니다. 따라서 한 번에 수행 할 수 있습니다.
unxnut

6
ggvim에 따라 다릅니다. 그건 1G기존의 VI에서.
Stéphane Chazelas

1
쉘 구문은 일부 쉘의 구성에 따라 다릅니다. bash 및 zsh (기본적으로 zsh) 대화식 쉘은 해당 명령을 수신 한 후 STDIN에서 입력을 기다릴 수 있으며 실제로 파일을 지우려면 추가 <CTRL> + D가 필요합니다. 이를 실행하는 기능은 CLOBBER 설정에 따라 다릅니다. >| test.txt < /dev/null파일을 항상 방해하고 대화식 터미널에서 입력을 기다리지 않기 때문에 다소 강력합니다.
Caleb

1
@ Caleb : POSIX 호환 쉘 에서 말했듯이 . :-)이 두 가지 상황 중 어느 것도 POSIX 불만입니다.
Chris Down

28

커서가 첫 번째 줄에 있으면 ( gg또는 입력하지 않은 경우 : 또는 1G),을 사용하면 dG됩니다. 현재 행에서 파일 끝까지 모든 행을 삭제합니다. 따라서 파일에서 모든 줄을 삭제하려면 ggdG(명령 모드에서) 두 줄을 함께 섞을 수 있습니다 .

또는 %dEx 모드에서 명령 행 예 : vim +%d foo.bar.

관련 : VIM에서 현재 줄에서 파일 끝까지 모든 텍스트를 어떻게 삭제합니까?


3
: 1, $ d보다 인체 공학적으로 +1 어쨌든 우리의 손가락은 항상 콜론을 입력하기 위해 배선되어 있지 않습니다.)
Aaron R.

2
공감. dG내가 항상 사용하는 것입니다.
lunchmeat317

1
ggdGvim에서 가장 쉬운 방법을 찾았습니다 . 이 답변이 다른 사람들처럼지지되지 않는 이유 gg는 순수한 vi에는 존재하지 않기 때문입니다 .
thameera

27

나는 게으른 친구이고 단순하게 유지하고 싶습니다. ggdG5 번의 키 스트로크Shift

gg파일의 첫 번째 줄로 가고 d, delete 동사 의 시작이며 G파일의 맨 아래로 이동하는 움직임입니다. 사실, 그것은 파일의 시작 부분으로 가서 타일이 끝날 때까지 모든 것을 삭제합니다.


rsrs. 나도 게으르고 사용 :$d하거나 :1,$d더 빠른 방법입니다 (작은 문자를 씁니다) kkk
Cold

3
:%d그런 식으로 5 번만 키를 사용하기 때문에 좋은 대안입니다.
TankorSmash

1
@TankorSmash gg는 아닌 vim명령 vi입니다.
kyrias

잘 잡아, 내 실수
TankorSmash

12

파일의 시작 부분으로 이동하여를 누릅니다 dG.


5

나는 항상 사용 ggVG

  • gg 현재 편집 파일의 시작으로 이동
  • V(대문자 v)는 현재 줄을 선택합니다. 이 경우 현재 편집 파일의 첫 줄
  • G(대문자 g)는 파일의 끝으로 이동합니다. 이 경우 첫 번째 줄 G을 선택 했으므로이 파일에서 전체 텍스트를 선택합니다.

그럼 당신은 단순히 눌러 d또는 x모든 줄을 삭제합니다.


d세로로 사용 하면 자동으로 선 방향으로 적용됩니다. 예를 들어 dl오른쪽의 문자를 dj삭제하고 줄을 삭제합니다.
TankorSmash

3

귀하의 질문에 echo > test.txt빈 파일이 아닌 한 줄 바꿈이있는 파일을 만듭니다.

쉘에서 echo -n > test.txt또는 사용을 고려하십시오 : > test.txt.

일반적으로 vi 편집 명령을 사용하지만 ()을 사용 ggdG하여 현재 파일을 참조하여 셸을 호출 할 수도 있습니다.

:!:>%

거의 간결 ggdG하지만 입력하기가 어렵고 수정 된 파일을 다시로드 할 것인지 확인해야 하므로이 경우 특히 권장하지는 않지만 vi에서 쉘 명령을 사용하는 방법을 아는 것은 다음과 같습니다 유능한.

그것을 분해 :

  • : vi 명령을 시작하다
  • ! 쉘 명령을 초기화
  • : 이것은 빈 출력을 가진 쉘 내장 명령입니다
  • > 출력을 리디렉션
  • % vi는 이것을 현재 파일 이름으로 대체합니다

제안 된 :1,$d것은 물론 좋은 것이며, 내가있는 동안에도1GdG


:!:>%vi쉘의 파일 이름을 이스케이프하지 않기 때문에 위험 합니다 ( $(reboot)예를 들어 파일을 편집 할 때하지 마십시오 ). 당신은 무언가가 필요합니다:call system(":>" . shellescape(expand("%")))
Stéphane Chazelas

3

다른 해결책 :

truncate -s 0 file

정말 간단 >file하지는 않지만 괜찮습니다.
phk

1
좋은 방법으로 보이지만 목표는 vi를 사용하여 수행하는 것입니다. Tks
Cold


-1

트릭을 사용하여 많은 수의 행을 삭제할 수 있습니다. 삽입 모드에 있지 않은지 확인하고 (ESC를 누름) 1000dd를 입력하십시오.


1
명령이 수행하는 작업 / 작동 방식에 대한 설명을 포함해야합니다 ( 커서가 첫 번째 행에 있지 않은 경우 모든 행을 삭제하지 않는 다음 1000 행 삭제 ).
sebasth

이것이 제가 트릭이라고 부르는 이유입니다.
Radu

-1

나는 gg줄의 상단에 도달하기 위해 입력 한 다음을 수행합니다 100 dd. 포인터를 편집기의 맨 위 줄로 가져오고 100 줄을 지 웁니다. 파일이 더 길면 줄을 더 추가하기 위해 숫자를 조정해야 할 수도 있습니다.


-1
> file.txt

정말로 원하지 않으면 vi를 열 필요조차 없습니다.


1
안녕하세요. U & L 스택 교환 사이트에 오신 것을 환영합니다. 이 사이트를 가장 잘 게시하는 방법에 대한 정보 는 도움말 센터 를 검토 하십시오. 우리는이 사이트에서 유익하고 독창적 인 질문과 답변을 양성하고자합니다. 귀하의 답변은이 게시물의 다른 답변 및 의견과 동일합니다. 제발 편집 좀 더 독특하고 유익한 대답하십시오로 게시물을. 감사합니다!
kemotep

게다가 문제의 핵심은 ... "vi 사용"
Jeff Schaller

나는 당신이 제안한 것을 정확하게 시도했습니다. 알았습니다 bash: > file.txt: command not found.
roaima

@roaima 다음과 같이 인용하면 얻을 수 있습니다 "> file.txt".
Kusalananda

1
@JeffSchaller : vi >file.txt ;-)
Kusalananda
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.