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?
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.
perl
accepts the parameter-i
for inplace. With this, you can process a file with a perl program and immediately have it written back.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.