我的文件夹中有一些文件有几个sqrt(x + y);功能。我想找出x + y中的内容。所以我想读取sqrt(x + y)中的值;并添加printf(x + y);分号后。我试了大约一个月。但还是找不到办法。
请帮忙。如果你知道我在哪里可以找到关于AWK的任何好的教程或书籍,请告诉我..谢谢。 以下是我想到的算法。 (我对AWK来说是全新的)
循环所有文件{ 如果一行以sqrt开头(开始将字符串放入变量a /或数组a 直到找到); write print(,concatenate,then value,concatenate,); 在下一行。
答案 0 :(得分:1)
您可以尝试以下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
答案 1 :(得分:0)
awk
当然是一个很好的工具,但为什么不拉伸一点?如果您愿意丢弃括号内的空格,请尝试:
cat << 'EOF' - input-file | m4
divert(-1)
define(`sqrt',`divert(1)'$1
`divert(-1)')
EOF
这应打印出名为sqrt
的文件中input-file
调用中出现的每个字符串。这不会评估字符串,但如果你想要的话,我不清楚。
此解决方案的主要优点是它可以很好地与嵌套括号一起使用。也就是说,sqrt( foo( bar( x + y )))
形式的行将正确打印foo( bar( x + y ))
,并且很难用awk
正确解析。主要缺点是它需要输入正确的语法(不平衡的括号会导致问题)。