답변:
해당 명령 이후에 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
ed
.
ed
명령은 다음과 같습니다 printf "%s\n" 1d w q | ed file.txt
(I 심장 ED)
-exec sed -i '1d' {} \;
대체로 가벼운 옵션은 첫 번째 줄을 제외한 모든 것을 '꼬리'하는 것입니다 (일반적으로 파일 헤더를 쉽게 제거 할 수있는 방법 일 수 있음).
# -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
부작용을 피하기 위해.
tail
트릭은 나를 위해 일했습니다 (130mb 파일에서 3 초 미만 걸렸습니다). 감사!
echo "$(tail -n +2 file.txt)" > file.txt
완벽한 답변입니다.
또한 한 번 봐 걸릴 sponge
에서을
moreutils
. sponge
파일에 쓰기 전에 표준 입력의 쓰기 끝이 닫힐 때까지 표준 입력에서 데이터를 흡수합니다. 다음과 같이 사용됩니다.
sed '1d' file.txt | sponge file.txt
이 주제는 관심이 있으므로 3 가지 방법으로 벤치 마크를 테스트합니다.
sed '1d' d.txt > tmp.txt
tail -n +2 d.txt > tmp.txt
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
가장 빠릅니다.
ex
임시 파일이 포함되지 않은 실제 편집에 사용될 수 있습니다.
ex -c ':1d' -c ':wq' file.txt
strace -e open ex -c ':1d' -c ':wq' foo
. ex는 임시 파일로 원본 파일을 자릅니다. 여기서 GNU sed의 -i 옵션은 원본을 임시 파일로 덮어 씁니다. BSD의 sed가 어떻게 작동하는지 잘 모르겠습니다.
고양이 file01 | sed -e '1,3d'
// file01에 내용을 표시하지만 첫 번째와 세 번째 줄을 제거합니다.
sed
사용할 수 있습니다sed -i .bak '1d' file.txt
.