bashioio-redirection

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


Basically I want to take as input text from a file, remove a line from that file, and send the output back to the same file. Something along these lines if that makes it any clearer.

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

however, when I do this I end up with a blank file. Any thoughts?


Solution

  • 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/sh
    tmpfile=$(mktemp)
    grep -v 'seg[0-9]\{1,\}\.[0-9]\{1\}' file_name > ${tmpfile}
    cat ${tmpfile} > file_name
    rm -f ${tmpfile}
    

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