如何使用awk
命令对文件进行永久修改?我一直在使用:
awk '/'"'"'test'"'"' =>./{c++}(c==2){sub("'"'"'test'"'"' =>.","'"'"'test'"'"' => '"'"'test1'"'"',")}1' testfile
我一直在使用上述命令进行临时更改,这些更改会立即打开更改。但是我想在脚本文件中使用它,并对文件进行永久更改,类似于sed -i
。
答案 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
但没有示例输入输出,我们无法确定-如果您需要更多帮助,请通过示例输入/输出发布新问题。