Why a linux redirect truncates the file?

2019-02-26 07:41发布

问题:

I have a file called "test.txt" like that:

hello world

it is, just a 'hello world' string. If I use a perl regex:

perl -pe "s/hello/bye/g" test.txt

it says:

bye world

but if I try to redirect that file to itself:

perl -pe "s/hello/bye/g" test.txt > test.txt

the resulting file is empty. Why? And how can I 'filter' a regex over a file?

回答1:

perl accepts the parameter -i for inplace. With this, you can process a file with a perl program and immediately have it written back.



回答2:

It opens the file for writing due to the redirect before the application gets a chance to read from it. Redirect to a temporary file instead, then rename it after.



回答3:

The redirection takes place while your shell is parsing your command line. This happens before the actual command is executed, thus the file you redirect to is overwritten before you have the chance to read it.