如何用awk写一个文件来查找between()之间的字符串;然后添加一条印刷线;打印发现的字符串?

时间:2013-12-04 03:01:36

标签: shell unix sed awk pattern-matching

我的文件夹中有一些文件有几个sqrt(x + y);功能。我想找出x + y中的内容。所以我想读取sqrt(x + y)中的值;并添加printf(x + y);分号后。我试了大约一个月。但还是找不到办法。

请帮忙。如果你知道我在哪里可以找到关于AWK的任何好的教程或书籍,请告诉我..谢谢。 以下是我想到的算法。 (我对AWK来说是全新的)

循环所有文件{ 如果一行以sqrt开头(开始将字符串放入变量a /或数组a             直到找到);         write print(,concatenate,then value,concatenate,);         在下一行。

2 个答案:

答案 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正确解析。主要缺点是它需要输入正确的语法(不平衡的括号会导致问题)。