Next: , Previous: Extension Sample Fork, Up: Extension Samples


16.7.4 Enabling In-Place File Editing

The inplace extension emulates GNU sed's -i option which performs “in place” editing of each input file. It uses the bundled inplace.awk include file to invoke the extension properly:

     
     # inplace --- load and invoke the inplace extension.
     
     @load "inplace"
     
     # Please set INPLACE_SUFFIX to make a backup copy.  For example, you may
     # want to set INPLACE_SUFFIX to .bak on the command line or in a BEGIN rule.
     
     BEGINFILE {
         inplace_begin(FILENAME, INPLACE_SUFFIX)
     }
     
     ENDFILE {
         inplace_end(FILENAME, INPLACE_SUFFIX)
     }
     

For each regular file that is processed, the extension redirects standard output to a temporary file configured to have the same owner and permissions as the original. After the file has been processed, the extension restores standard output to its original destination. If INPLACE_SUFFIX is not an empty string, the original file is linked to a backup filename created by appending that suffix. Finally, the temporary file is renamed to the original filename.

If any error occurs, the extension issues a fatal error to terminate processing immediately without damaging the original file.

Here are some simple examples:

     $ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1 file2 file3

To keep a backup copy of the original files, try this:

     $ gawk -i inplace -v INPLACE_SUFFIX=.bak '{ gsub(/foo/, "bar") }
     > { print }' file1 file2 file3

We leave it as an exercise to write a wrapper script that presents an interface similar to ‘sed -i’.