파일의 첫 줄을 삭제하고 변경 내용을 유지하려면 어떻게해야합니까?
나는 이것을 시도했지만 파일의 전체 내용을 지 웁니다.
$sed 1d file.txt > file.txt
답변
해당 명령 이후에 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
답변
대체로 가벼운 옵션은 첫 번째 줄을 제외한 모든 것을 ‘꼬리’하는 것입니다 (일반적으로 파일 헤더를 쉽게 제거 할 수있는 방법 일 수 있음).
# -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
부작용을 피하기 위해.
답변
또한 한 번 봐 걸릴 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
답변
ex
임시 파일이 포함되지 않은 실제 편집에 사용될 수 있습니다.
ex -c ':1d' -c ':wq' file.txt
답변
파일을 사용하여 파일에서 첫 번째 줄을 삭제하는 가장 짧고 간단한 방법 sed
은 다음과 같습니다.
$ sed -i -n -e '2,$p' file.txt
답변
Ex 모드에서 Vim을 사용할 수 있습니다 :
ex -s -c '1d|x' file.txt
-
1
첫 줄을 찾으십시오 -
d
지우다 -
x
저장하고 닫습니다