如何在脚本中使用awk命令保存永久修改

时间:2018-07-22 17:32:41

标签: awk

如何使用awk命令对文件进行永久修改?我一直在使用:

awk '/'"'"'test'"'"' =>./{c++}(c==2){sub("'"'"'test'"'"' =>.","'"'"'test'"'"' => '"'"'test1'"'"',")}1' testfile

我一直在使用上述命令进行临时更改,这些更改会立即打开更改。但是我想在脚本文件中使用它,并对文件进行永久更改,类似于sed -i

1 个答案:

答案 0 :(得分:3)

在将其作为dup关闭之前,请至少清理一下代码。这个:

awk '/'"'"'test'"'"' =>./{c++}(c==2){sub("'"'"'test'"'"' =>.","'"'"'test'"'"' => '"'"'test1'"'"',")}1' testfile

很难阅读。我假设所有这些'"'"'都试图将单引号添加到代码中。如果是这样,则可以提高清晰度,并且在脚本存储在文件中时也可以使用,对每个单引号使用八进制表示\047代替:

awk '/\047test\047 =>./{c++} (c==2){sub("\047test\047 =>.","\047test\047 => \047test1\047,")}1' testfile

现在对正则表达式使用正则表达式定界符,它是sub()的第一个参数:

awk '/\047test\047 =>./{c++} (c==2){sub(/\047test\047 =>./,"\047test\047 => \047test1\047,")}1' testfile

还有其他一些可能的改进,包括使用后向引用而不是对替换中的原始sub()字符串进行硬编码,以及使用match(),因此您无需在测试中测试相同的正则表达式脚本的条件部分,然后再次在sub()中,所以您可能需要这样的东西(使用GNU awk作为第三个参数match()):

awk 'match($0,/(.*\047test\047 =>.)(.*)/,a){c++} c==2{$0=a[1] "\047test1\047" a[2]} 1' testfile

但没有示例输入输出,我们无法确定-如果您需要更多帮助,请通过示例输入/输出发布新问题。