在AWK中使用正则表达式在双反斜杠之前匹配带括号的线条

时间:2014-06-05 17:01:59

标签: regex awk gawk

我有一个AWK脚本,我正在尝试检查进入它的行是否有(但是只有在//之前或没有//(其中C代码,所以基本上看是否在评论之前发生了某些事情。)

现在我有

if (match($0,/(\()/))
    do stuff

这与括号完全匹配,但我似乎无法在双反斜杠之前停止它。我四处寻找答案并尝试了一些事情,但我显然做错了。

在我发现的(\()建议之后添加以下内容但似乎不起作用:(?:\/\/)(?=\/\/)

大约一年半前我对正则表达式有很好的处理,但从那时起我就没有触及它,并且变得非常生疏。所以,如果有一个好的网站不会在基础知识上花费很长时间,但是对大多数事情做了很好的描述也会有所帮助(找到一些教程,但没有一个是超级有用的)。

编辑:因此示例输入将是

#define aa (aad|dadfa|adsfas) // This line does a thing
#define bb //This line does a thing (but a different thing)
#define cc (cccc cccc cccc)

我想拉

aad|dadfa|adsfas
从第一行

,第二行没有任何内容,

cccc cccc cccc

来自第三行。

重要提示:如我所见,我刚刚注意到我想要提取的某些行没有任何评论,因此需要在(//之前匹配(在没有//的行上。

edit2:对不起,我有点跳到了示例输出的第二步。从该示例输入我真的只需要获得第1行和第3行的true以及第2行的false。我有代码然后将从括号之间提取文本。所以给出的样本输出是我正在寻找的最终输出,但是我遇到问题的部分是选择要使用的行。

2 个答案:

答案 0 :(得分:0)

这就是你想要的:

$ awk '{sub(/\/\/.*/,"")} match($0,/\([^)]+\)/){ print substr($0,RSTART+1,RLENGTH-2) }' file
aad|dadfa|adsfas
cccc cccc cccc

它只删除该行中的任何注释,然后在parens之间提取任何文本。

如果没有,请再次尝试澄清您的要求并提供更具代表性的输入/输出。

答案 1 :(得分:-1)

regex = .*\(.*\/\/.* 在这里测试:

http://regexr.com/38v3v

获得与a匹配的完整行(某处后跟//注释,

.*获得了第一行的开头 (必须匹配,然后是 .*其余部分直至中 \/\/评论指标,后跟
.*评论文本