파일의 첫 줄 삭제


110

파일의 첫 줄을 삭제하고 변경 내용을 유지하려면 어떻게해야합니까?

나는 이것을 시도했지만 파일의 전체 내용을 지 웁니다.

$sed 1d file.txt > file.txt

답변:


81

해당 명령 이후에 file.txt가 비어있는 이유는 쉘이 수행하는 순서입니다. 해당 줄에서 가장 먼저 발생하는 것은 리디렉션입니다. "file.txt"파일이 열리고 0 바이트로 잘립니다. 그 후 sed 명령이 실행되지만 그 시점에서 파일은 이미 비어 있습니다.

몇 가지 옵션이 있으며, 대부분 임시 파일에 쓰는 것이 포함됩니다.

sed '1d' file.txt > tmpfile; mv tmpfile file.txt # POSIX
sed -i '1d' file.txt # GNU sed only, creates a temporary file

perl -ip -e '$_ = undef if $. == 1' file.txt # also creates a temporary file

2
BSD와 함께 sed사용할 수 있습니다 sed -i .bak '1d' file.txt.

1
임시 파일을 포함하지 않는 방법이 있습니까? 어쨌든, 이것은 트릭을 할 것입니다. 고마워요!
kickass13

@ kickass13은 같은 텍스트 편집기를 사용합니다 ed.
jordanm

6
ed명령은 다음과 같습니다 printf "%s\n" 1d w q | ed file.txt(I 심장 ED)
글렌 잭맨

1
@jonayreyes-exec sed -i '1d' {} \;
jordanm

141

대체로 가벼운 옵션은 첫 번째 줄을 제외한 모든 것을 '꼬리'하는 것입니다 (일반적으로 파일 헤더를 쉽게 제거 할 수있는 방법 일 수 있음).

# -n +2 : start at line 2 of the file.
tail -n +2 file.txt > file.stdout

@Evan Teitelman에 따르면 다음을 수행 할 수 있습니다.

tail -n +2 file.txt | sponge file.txt

임시 파일을 피하기 위해. 다른 옵션은 다음과 같습니다.

echo "$(tail -n +2 file.txt)" > file.txt

기타 등등. 마지막 테스트 :

[user@work ~]$ cat file.txt
line 1
line 2
line 3
line 4
line 5

[user@work ~]$ echo "$(tail -n +2 file.txt)" > file.txt
[user@work ~]$ cat file.txt
line 2
line 3
line 4
line 5
[user@work ~]$ 

죄송합니다 (아래 @ 1_CR 댓글 당).

printf "%s\n\n" "$(tail -n +2 file.txt)" > file.txt

[user@work ~]$ cat file.txt
line 1
line 2
line 3
line 4
line 5

[user@work ~]$ printf '%s\n\n' "$(tail -n +2 file.txt)" > file.txt
[user@work ~]$ cat file.txt
line 2
line 3
line 4
line 5  

[user@work ~]$ 

sed로 돌아와서 다음을 시도하십시오.

printf '%s\n\n' "$(sed '1d' file.txt)" > file.txt

또는 아마도

echo -e "$(sed '1d' file.txt)\n" > file.txt

부작용을 피하기 위해.


방금 Fedora 시스템에서 시도했지만 출력이 위입니다. 당신이 맞습니다-지적 해 주셔서 감사합니다.
AsymLabs

tail트릭은 나를 위해 일했습니다 (130mb 파일에서 3 초 미만 걸렸습니다). 감사!
elo80ka

echo "$(tail -n +2 file.txt)" > file.txt완벽한 답변입니다.
Alex Raj Kaliamoorthy

감사합니다! echo "$ (tail -n +2 file.txt)"> file.txt는 마치 매력처럼 작동합니다!
Arsenii

16

또한 한 번 봐 걸릴 sponge에서을 moreutils. sponge파일에 쓰기 전에 표준 입력의 쓰기 끝이 닫힐 때까지 표준 입력에서 데이터를 흡수합니다. 다음과 같이 사용됩니다.

sed '1d' file.txt | sponge file.txt

14

이 주제는 관심이 있으므로 3 가지 방법으로 벤치 마크를 테스트합니다.

  1. sed '1d' d.txt > tmp.txt
  2. tail -n +2 d.txt > tmp.txt
  3. sed -i '1d' d.txt

대상 d.txt은 5.4GB 파일입니다.

결과를 얻으십시오 :


run 1 : sed '1d' d.txt > r1.txt
14s
run 2 : tail -n +2 d.txt > r2.txt
20s
run 3 : sed -i '1d' d.txt
88s

결론 : 가장 빠른 방법은 다음과 같습니다.

sed '1d' file.txt > tmpfile; mv tmpfile file.txt


귀하의 sed '1d' d.txt방법은 명령을 포함하지 않았습니다 (또는 테스트를 읽는 것으로 보입니다) mv. 20MB 파일로 FreeBSD에 대한 테스트에서 sed -i가장 빠릅니다.
Sopalajo de Arrierez

9

ex임시 파일이 포함되지 않은 실제 편집에 사용될 수 있습니다.

ex -c ':1d' -c ':wq' file.txt

2
ex는 임시 파일을 사용합니다. strace -e open ex -c ':1d' -c ':wq' foo. ex는 임시 파일로 원본 파일을 자릅니다. 여기서 GNU sed의 -i 옵션은 원본을 임시 파일로 덮어 씁니다. BSD의 sed가 어떻게 작동하는지 잘 모르겠습니다.
llua December

@llua, 당신 말이 맞아요. 나도 그 사실을 알아 차렸다
iruvar

3

파일을 사용하여 파일에서 첫 번째 줄을 삭제하는 가장 짧고 간단한 방법 sed은 다음과 같습니다.

$ sed -i -n -e '2,$p' file.txt

3

Ex 모드에서 Vim을 사용할 수 있습니다 :

ex -s -c '1d|x' file.txt
  1. 1 첫 줄을 찾으십시오

  2. d 지우다

  3. x 저장하고 닫습니다


0

이 명령은 한 줄을 제거하고 "file.txt"로 저장합니다.

sed '1d' file.txt  > /tmp/file.txt && mv /tmp/file.txt file.txt || rm -f /tmp/file.txt

0

파일에서 praticiler 줄을 삭제하려면

  1. 첫 줄 삭제

Sed '1d'파일

  1. 첫 번째와 세 번째 줄 삭제

Sed '1d3d'파일

줄에서 문자 삭제

1 린에서 처음 두 헌장 삭제

Sed 's /^..//'파일

2 마지막 두 chrectercin 라인 삭제

Sed 's / .. £ //'파일

3 빈 줄 삭제

Sed '/ ^ £ / d'파일


4
영국은 식민지를 되찾았습니까? 지난번에 £$였습니다.
G-Man

£ 표시
인형

0

vim을 사용하여이를 수행 할 수 있습니다.

vim -u NONE +'1d' +wq! /tmp/test.txt

-2

고양이 file01 | sed -e '1,3d'

// file01에 내용을 표시하지만 첫 번째와 세 번째 줄을 제거합니다.


2
sed 명령은 1, 2, 3 행을 제거합니다.
icarus

1
이것은 요청 된 것 이상을 삭제하고 "변경 사항을 유지"하지 않습니다
Jeff Schaller
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.