How can I use a file in a command and redirect output to the same file without truncating it? How can I use a file in a command and redirect output to the same file without truncating it? bash bash

How can I use a file in a command and redirect output to the same file without truncating it?


Use sponge for this kind of tasks. Its part of moreutils.

Try this command:

 grep -v 'seg[0-9]\{1,\}\.[0-9]\{1\}' file_name | sponge file_name


You cannot do that because bash processes the redirections first, then executes the command. So by the time grep looks at file_name, it is already empty. You can use a temporary file though.

#!/bin/shtmpfile=$(mktemp)grep -v 'seg[0-9]\{1,\}\.[0-9]\{1\}' file_name > ${tmpfile}cat ${tmpfile} > file_namerm -f ${tmpfile}

like that, consider using mktemp to create the tmpfile but note that it's not POSIX.


Use sed instead:

sed -i '/seg[0-9]\{1,\}\.[0-9]\{1\}/d' file_name