匹配多个字符一次或多次

时间:2017-12-07 15:22:26

标签: regex string bash

考虑以下问题: 我们有一串从/ dev / urandom流出的随机字符,我们希望以这样的方式处理它,即我们将获得满足特定条件的恒定长度的字符串。 例如,如果我们运行以下命令5次,我们得到:

cat /dev/urandom |tr -dc A-Z5|head -c${1:-30}
DLZEZDATSTDN55BNVDSNRFSLRKHDGR
AVCRIE5OAFBUWZZYQYQWCTAZSNMQAA
HSTFN5AQNWILXMSZCBIGREPNCFGPDM
AZJNEUQRCDYSKXMQDUHVTOFEOAYPHF
ANFDWHHZHLAGXCPKWLQESSZLEZYNDC

现在,这些字符串符合我需要的条件,但只是部分。 对于前者我需要数字5在字符串中出现至少2次但不超过7次,并且任何字母不应出现超过10次。 我应该如何自定义上面的命令才能得到这个结果?

2 个答案:

答案 0 :(得分:1)

使用GNU awk 处理:

awk -v FS="" '{ 
                  err=0; 
                  for(i=1; i<=NF; i++) { 
                      a[$i]++; 
                      if ($i~/[A-Z]/ && a[$i]>10) { err=1; break } 
                  } 
                  if (!err && (2>a[5] || a[5]>7)) err=1 
              }
              END{ if (!err) print }' <(cat /dev/urandom | tr -dc A-Z5 | head -c30)
  • FS="" - 在这种情况下,记录中的每个字符都成为一个单独的字段

只有满足所有条件时,上述内容才会打印随机字符串。

答案 1 :(得分:1)

使用带有OP所需过滤器的函数的Bash解决方案。

说明:

过滤器是字符5出现次数。我通过使用 tr 删除字符串上的所有内容,除了字符5,然后计算剩余的字符数。

grep -E'(。)(。 \ 1){10}'*是一个标准的正则表达式,以确保没有任何字符出现超过10次。

循环然后只接一个随机字,直到满足所有三个条件。当然可能需要一段随机时间。 :P

add_filter( 'woocommerce_is_purchasable', 'wpa_109409_is_purchasable', 10, 2 );

function wpa_109409_is_purchasable( $purchasable, $product ){
    if( $product->get_price() >= 0 )
        $purchasable = true;
    return $purchasable;
}

用法:

enter image description here