未找到shell正则表达式(数字,长度和K字母)

时间:2016-06-02 20:01:56

标签: regex bash shell

我的代码或正则表达式未找到,我试过:

'^([0-9]{7,8})+([K|0-9]{1})'

'#[0-9]{7,8}[K 0-9]{1}'

'#[0-9]{7,8}[K 0-9]{1}'

"^([0-9]{7,8})+([K|0-9]{1})$"

*我需要返回(1234567或12345678)+ K或数字(未找到\ d)

例如:123456789 12345678K 12345678

*使用此正则表达式'^ [0-9] {7,8} [K | 0-9] {1}'返回:

ok 184587939

ok 17678977K

ok 186613074

ok 18661307Z (不用最后一位数字)

invalido 18R613074

ok 1845879398888888 (未找到长度)

ok 18458793U

invalido 18661G074

invalido 18661G07T

ok 18458793

invalido 1845E793

#!/bin/bash
var='^([0-9]{7,8})+([K|0-9]{1})$'
for LINEA in `cat rut.txt ` #LINEA guarda el resultado del fichero rut.txt
do
    rut=`echo $LINEA | cut -d ":" -f1` #Extrae rut
    rut=$(echo $rut | tr 'a-z' 'A-Z')
    while :
    do
        if [[ $rut =~ $var ]];then ()
             #$rut >> rutok.txt
             echo $rut | cat >> rutok.txt
            echo $rut' ok'
            break
        else
             #$rut >> rutinv.txt
             echo $rut | cat >> rutinv.txt
            echo $rut' inv'
            break

        fi
    done
done
exit 0

3 个答案:

答案 0 :(得分:1)

如果我理解正确,我相信这就是你所追求的。

^([0-9]{8}|[0-9]{7}K)$

答案 1 :(得分:0)

你可以试试这个:

 ^([0-9]{7,8})([k0-9])$

有关

  

184587939
         17678977K
         186613074

^([0-9]{7,8})([a-z0-9])$对于

  

184587939
         17678977K
         186613074个
         17678977A
         18661307B
         17678977U
         18661307L

答案 2 :(得分:0)

您的问题非常不清楚,但此外,您的代码非常复杂。您似乎只是在寻找grepgrep -v。循环使用for的文件中的行是绝对错误的(请参阅http://mywiki.wooledge.org/DontReadLinesWithFor),但while read -r循环通常也是反模式。在一般情况下,这些通常是要求出生的Awk脚本的例子。

cut -d : -f1 rut.txt |
tr A-Z a-z |
awk '/^([0-9]{7,8})([KZ0-9])$/ { print >>"rutok.txt"; next }
    { print >> "rutinv.txt" }'

{1}重复只是多余的(否则我们必须写h{1}t{1}t{1}p{1}等来匹配一个简单的字符串!)并且在字符类中,你只需枚举字符范围;如果您不想匹配文字|字符,请不要将其放入字符类中。

([0-9]{7,8})+表示一次或多次重复7或8个数字;所以7,8,14,15,16,21,......重复。根据博览会,这不是你想要的。

猜测上面的正则表达式涵盖了你的情况:七位或八位数字以及一个或多一个数字。

此外,返回shell脚本时,不应将大写用于自己的变量(这些变量保留供系统使用);并且您需要引用您的字符串,除非您特别希望shell对值执行令牌拆分和通配符扩展(尽管这可能在这里可能是无害的)。最后,while循环似乎没有任何用处,因为在每种情况下第一次迭代都会break出现。{/ p>