How can I delete the first line of a file and keep the changes?
I tried this but it erases the whole content of the file.
$sed 1d file.txt > file.txt
How can I delete the first line of a file and keep the changes?
I tried this but it erases the whole content of the file.
$sed 1d file.txt > file.txt
An alternative very lightweight option is just to 'tail' everything but the first line (this can be an easy way to remove file headers generally):
# -n +2 : start at line 2 of the file.
tail -n +2 file.txt > file.stdout
Following @Evan Teitelman, you can:
tail -n +2 file.txt | sponge file.txt
To avoid a temporary file. Another option might be:
echo "$(tail -n +2 file.txt)" > file.txt
And so forth. Testing last one:
[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 ~]$
Oops we lost a newline (per @1_CR comment below), try instead:
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 ~]$
Coming back to sed, try:
printf '%s\n\n' "$(sed '1d' file.txt)" > file.txt
or perhaps
echo -e "$(sed '1d' file.txt)\n" > file.txt
To avoid side effects.
The reason file.txt is empty after that command is the order in which the shell does things. The first thing that happens with that line is the redirection. The file "file.txt" is opened and truncated to 0 bytes. After that the sed command runs, but at the point the file is already empty.
There are a few options, most involve writing to a temporary file.
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
command would be: printf "%s\n" 1d w q | ed file.txt
(I heart ed)
– glenn jackman
Oct 16 '13 at 01:44
find . -name "myfiles*" -exec sed '1d' xxxxxxxxx > tmpfile; mv tmpfile xxxxxxxx
. Do I have to put two blocks of {}
there?
– jonayreyes
Aug 30 '17 at 10:51
sed -i '1d' file.txt
, but if I want to delete first 100
line. sed -i '100d' file.txt
does'nt work.
– alhelal
Dec 28 '17 at 12:36
This topic is interest, so I test the benchmark in 3 ways:
sed '1d' d.txt > tmp.txt
tail -n +2 d.txt > tmp.txt
sed -i '1d' d.txt
Note that target d.txt
is 5.4GB file
Get the result :
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
Conclusion : It seems below be the quickest way:
sed '1d' file.txt > tmpfile; mv tmpfile file.txt
sed '1d' d.txt
method did not include (or so it seems by reading your tests) the mv
command. In my tests on FreeBSD with a 20MB file the sed -i
was the quickest.
– Sopalajo de Arrierez
Feb 11 '18 at 23:04
Also take a look at sponge
from
moreutils
. sponge
soaks in data from
standard input until standard input's writing end closes before writing to a
file. It is used like so:
sed '1d' file.txt | sponge file.txt
ex
can be used for true in-place editing that does not involve a temp file
ex -c ':1d' -c ':wq' file.txt
strace -e open ex -c ':1d' -c ':wq' foo
. ex truncates the original file with the temp file, where as GNU sed's -i option overwrites the original with the temp file. I am not sure how BSD's sed works.
– llua
Dec 05 '13 at 16:03
You can use Vim in Ex mode:
ex -s -c '1d|x' file.txt
1
find first line
d
delete
x
save and close
The shortest and simplest way to delete the first line from a file using sed
is:
$ sed -i -n -e '2,$p' file.txt
To delete a particular line in file:
sed '1d' file
sed '1d3d' file
To delete a charecter in a line
sed 's/^..//' file
sed 's/..$//' file
sed '/^$/d' file
counter=0 ; while read line; do [ $counter != 0 ] && echo $line ; counter=$(( counter+1 )) ; done < ./test > /tmp/test ; mv /tmp/test ./test
I can't find a way of avoiding a temp file, the closest is as above creating the output in /tmp which is not meaningfully different to a temp fle.
– JPGConnolly Feb 21 '24 at 14:15This command will remove 1 line and save as "file.txt".
sed '1d' file.txt > /tmp/file.txt && mv /tmp/file.txt file.txt || rm -f /tmp/file.txt
tail
trick worked for me (took less than 3 seconds on a 130mb file). Thanks! – elo80ka Aug 18 '14 at 17:51echo "$(tail -n +2 file.txt)" > file.txt
is the perfect answer. – Alex Raj Kaliamoorthy Nov 22 '16 at 12:26echo -e
answer has the side effect of replacing "\n" literals in the file with actual new lines – Mohammad Jafar Mashhadi Feb 07 '20 at 22:20