在完整路径中最多包含两个“a”个字符的文件

时间:2012-12-10 18:55:58

标签: regex awk

我正在试图找出如何使用AWK查找在其完整路径中最多包含两个'a'字符的文件。

以下是我到目前为止所做的,但它没有完成这项工作。

BEGIN{}

{
if( match( $1, ".*[a].*[a].*[^a]+" ) )
print $1
}

END{}

它通过以下命令从名为“data”的文件中读取文件名及其完整路径。

find / -name '*'

我应该修改什么?

3 个答案:

答案 0 :(得分:6)

以下被判断得太短,无法自己回答,但这只是我想写的:

^[^a]*(a[^a]*(a[^a]*)?)?$

顺便说一句,您不需要awkgrep -E可以正常使用。

但是现在我想起来了,如果你打算使用awk,下面的内容就更简单了:

awk '!/a.*a.*a/'

答案 1 :(得分:2)

您有三个错误。

  1. 您需要包含行尾和行尾模式^$,否则任意前缀或后缀可能包含一些a
  2. 您需要使用括号和a使?成为可选项。
  3. .*可以包含a,因此您需要使用[^a]来匹配非字符。
  4. 结果将是一个正则表达式,如:

    ^([^a]*a)?([^a]*a)?[^a]*$
    

    修改:

    正如Ed在下面的评论his answer中指出的那样,如果您将--re-interval标志传递给Awk,则可以使用间隔。

    然后表达式为:

    ^([^a]*a){0,2}[^a]*$
    

    这允许我们说我们希望在0到2之间找到a s。

答案 2 :(得分:2)

正确的解决方案是:

awk '!/(.*a){3}/' file
如果您的awk不支持RE间隔,请

或其中任何一个:

awk 'gsub(/a/,"&") < 3' file
awk 'split($0,x,/a/) < 3' file

所以在任何一种情况下如果你想测试少于17“a”你只需要改变3到17(例如):

awk '!/(.*a){17}/' file

而不是写作:

awk '^[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?$'

或类似。