我的代码或正则表达式未找到,我试过:
'^([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
答案 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)
您的问题非常不清楚,但此外,您的代码非常复杂。您似乎只是在寻找grep
和grep -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>