如何使用awk在文件中写入一个文件(); 并在之后添加一个printline; 打印find的string?

我有一个文件夹中有几个sqrt(x + y); function。 我想知道x + y是什么。 所以我想读取sqrt(x + y)中的值; 并添加一个printf(x + y); 分号后。 我试了一个月左右。 但是还是找不到方法。

请帮忙。 如果你知道我在哪里可以find任何关于AWK的好教程或书,请让我知道..谢谢。 以下是我想到的algorithm。 (我对AWK是全新的)

循环所有文件{如果一行以sqrt开头(开始将string放入variablesa或数组a中直到find); 写print(,连接,然后是value,concatenate); 在下一行。

你可以尝试下面的bash脚本:

#! /bin/bash files=(*.txt) for ((i=0; i<${#files[@]}; i++)) ; do file="${files[$i]}" awk -f f.awk "$file" > "${file}.mod" done 

f.awk是:

 { gsub(/\([^)]*\)/,"&; printf&") print } 

请注意,这将不适用于嵌套的括号,如sqrt(4+2*(x+y)) 。(如果需要,我可以尝试更新我的答案)。

给出示例文件input.txt

 x=7; sqrt(x+5*4); sqrt(x*x); i=3; a=2+sqrt(8); 

运行: awk -f f.awk input.txt给出:

 x=7; sqrt(x+5*4); printf(x+5*4); sqrt(x*x); printf(x*x); i=3; a=2+sqrt(8); printf(8); 

对于Gnu Awk,我推荐以下Awk资源: http : //www.gnu.org/software/gawk/manual/gawk.html

awk当然是一个很好的工具,但为什么不舒展一点? 如果您愿意放弃括号内的空格,请尝试:

 cat << 'EOF' - input-file | m4 divert(-1) define(`sqrt',`divert(1)'$1 `divert(-1)') EOF 

这应该打印出每个字符串出现在名为input-file的文件中调用sqrt 。 这不会评估字符串,但是如果你想要的话,我不清楚。

这个解决方案的主要优点是它可以和嵌套的括号一起工作。 也就是说, sqrt( foo( bar( x + y )))将会正确地打印foo( bar( x + y )) ,这很难用awk正确解析。 主要的缺点是它需要输入正确的语法(不平衡的括号会导致问题)。