AWK 原地修改
[TOC]
sed 可以通过 sed -i
实现对输入文件的直接修改, 也就是原地修改, i
是 in place 的意思. AWK 是没有此选项的, 如何实现原地修改的效果呢? 本文总结了 2 种方法.
print 重定向
凭直觉的话, 可能会想到如下写法:
1 | awk '{print $0}' t > t |
然而这么做, 输出的文件 t
最终是空的.
需要采用如下方式:
1 | awk '{print $0 > "t"}' t |
最常见的需要原地修改的场景是特定字符串的替换, 例如 gsub()
, sub()
函数. 例子如下:
1 | $ echo -e "AA\nCAAB\nDD" > t #构造输入文件 |
当然也可以曲线救国, 用临时文件(没那么优雅):
1 | awk '{print $0}' t > temp |
gawk 的 inplace
extension
gawk 吸取 sed -i
的优点, 增加了一个 inplace
extension. 对此拓展的加载, 这里不做介绍, 一般是加载进去的. 用法如下:
1 | $ gawk -i inplace '{ gsub(/AA/, "aa") }; { print }' t |
也可以同时保存原文件的副本:
1 | $ gawk -i inplace -v inplace::suffix=.bak '{ gsub(/AA/, "aa") } |
详细可以参考 gawk 的手册.