파일의 첫 번째 줄을 삭제하고 변경 사항을 유지하려면 어떻게 해야 합니까?
이것을 시도했지만 파일의 전체 내용이 삭제되었습니다.
$sed 1d file.txt > file.txt
답변1
또 다른 매우 간단한 옵션은 첫 번째 줄을 제외한 모든 항목을 "추적"하는 것입니다(이것은 파일 헤더를 제거하는 쉬운 방법인 경우가 많습니다).
# -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
부작용을 피하기 위해.
답변2
이 명령 후에 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
답변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
답변4
ex
임시 파일을 포함하지 않는 진정한 내부 편집 에 사용할 수 있습니다.
ex -c ':1d' -c ':wq' file.txt