Saturday, February 16, 2019

shell - Find and replace in file and overwrite file doesn't work, it empties the file




I would like to run a find and replace on an HTML file through the command line.



My command looks something like this:



sed -e s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html > index.html


When I run this and look at the file afterward, it is empty. It deleted the contents of my file.




When I run this after restoring the file again:



sed -e s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html


The stdout is the contents of the file, and the find and replace has been executed.



Why is this happening?


Answer



When the shell sees > index.html in the command line it opens the file index.html for writing, wiping off all its previous contents.




To fix this you need to pass the -i option to sed to make the changes inline and create a backup of the original file before it does the changes in-place:



sed -i.bak s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html


Without the .bak the command will fail on some platforms, such as Mac OSX.


No comments:

Post a Comment

plot explanation - Why did Peaches' mom hang on the tree? - Movies & TV

In the middle of the movie Ice Age: Continental Drift Peaches' mom asked Peaches to go to sleep. Then, she hung on the tree. This parti...