How can I remove the last comma separator from the end of a file?
Using GNU sed
:
sed -i '$s/,$//' file
That is, on the last line ($
) substitute (s
) the comma at the end of the line (,$
) by nothing.
The change will be done in-place due to the -i
flag.
With standard sed
:
sed '$s/,$//' <file >file.new &&
mv file.new file
Note: Someone suggested an edit to change "on the last line" to "last on the line" (or something similar). This is wrong. When $
is used to specify an address (a line where to apply an editing command), then it refers to the last line of the stream or file. This is different from using $
in a regular expression.
For in-place editing you could use ed
- conveniently, it sets the position to the last line by default on opening so you don't need to address the last line explicitly:
ed file
s/,$//
wq
Or, as a one-liner
printf 's/,$//\nwq\n' | ed -s file
In general, I'd probably go with the straightforward sed
solution. However, if your input files are huge, you might want a solution that doesn't take the time to read through the whole file just to edit the last couple of bytes.
If you are 100% sure your input file ends with a comma followed by a newline, you can use truncate
to lop off these last two characters, and then re-append a final newline:
filesize=$(stat -L --format "%s" lastcomma.txt)
truncate --size $((filesize - 2)) lastcomma.txt
echo >> lastcomma.txt
This assumes a distro that includes GNU truncate or equivalent.
@StéphaneChazelas points out that GNU truncate
now supports truncate -s -2 file
to shorten the file by two bytes; if you have this version, the above simplifies to:
truncate --size -2 lastcomma.txt
echo >> lastcomma.txt