Save modifications in place with awk

前端 未结 8 1965
轻奢々
轻奢々 2020-11-21 23:32

I am learning awk and I would like to know if there is an option to write changes to file, similar to sed where I would use -i option

8条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-11-21 23:58

    Unless you have GNU awk 4.1.0 or later...

    You won't have such an option as sed's -i option so instead do:

    $ awk '{print $0}' file > tmp && mv tmp file
    

    Note: the -i is not magic, it is also creating a temporary file sed just handles it for you.


    As of GNU awk 4.1.0...

    GNU awk added this functionality in version 4.1.0 (released 10/05/2013). It is not as straight forwards as just giving the -i option as described in the released notes:

    The new -i option (from xgawk) is used for loading awk library files. This differs from -f in that the first non-option argument is treated as a script.

    You need to use the bundled inplace.awk include file to invoke the extension properly like so:

    $ cat file
    123 abc
    456 def
    789 hij
    
    $ gawk -i inplace '{print $1}' file
    
    $ cat file
    123
    456
    789
    

    The variable INPLACE_SUFFIX can be used to specify the extension for a backup file:

    $ gawk -i inplace -v INPLACE_SUFFIX=.bak '{print $1}' file
    
    $ cat file
    123
    456
    789
    
    $ cat file.bak
    123 abc
    456 def
    789 hij
    

    I am happy this feature has been added but to me, the implementation isn't very awkish as the power comes from the conciseness of the language and -i inplace is 8 characters too long i.m.o.

    Here is a link to the manual for the official word.

提交回复
热议问题