在Bash中实现Regex
如果我的文本文件行有5个[A-Z 0-9]字符加逗号的任意组合,我试图抛出一个错误,如下所示:在Bash中实现Regex,regex,Regex,如果我的文本文件行有5个[A-Z 0-9]字符加逗号的任意组合,我试图抛出一个错误,如下所示: WH3Y4, H7UF5, WH3Y4 test H7UF5 test 但我的代码显示了错误,即使文本行是这样的,逗号后面有空格和单词: WH3Y4, my test H7UF5, your test 如果我了解如何做到这一点,我在下面使用的正则表达式应该可以工作: ^ to indicate the beginning of the text line [A-Z0-9]{5} to indi
WH3Y4,
H7UF5,
WH3Y4 test
H7UF5 test
但我的代码显示了错误,即使文本行是这样的,逗号后面有空格和单词:
WH3Y4, my test
H7UF5, your test
如果我了解如何做到这一点,我在下面使用的正则表达式应该可以工作:
^ to indicate the beginning of the text line
[A-Z0-9]{5} to indicate 5 chars of either cap letter or numbers
, to indicate they are followed by a comma
$ to indicate the end of the text line
因此,理论上,当它在同一行遇到逗号后的任何文本时,它不应该产生错误,但事实就是这样:
if ! [[ $myText =~ ^[A-Z0-9]{5},$ ]]; then
echo "Error"
continue
fi
类似地,如果我想在文本如下所示时出错:
WH3Y4,
H7UF5,
WH3Y4 test
H7UF5 test
这应该行得通,但也不行:
if ! [[ $myText =~ ^[A-Z0-9]{5} *[A-Za-z]$ ]]; then
echo "Error"
continue
fi
当我按照评论中的建议尝试时:
[[ "$myText" =~ ^[A-Z0-9]{5},\$ ]]
它会为此产生一个错误,因为它应该:
WH3Y4,
H7UF5,
但也会为此产生错误,因为它不应该:
WH3Y4, my test
H7UF5, your test
我认为$的意思是表示行的结尾,但是如果行继续包含更多字符,那么它就不应该与错误条件匹配。您的代码似乎没有实现您想要的。你说
I am trying to throw an error if my text file lines have any combination
of 5 [A-Z 0-9] chars followed by a comma and nothing else
但是你的代码说
if ! [[ $myText =~ ^[A-Z0-9]{5},$ ]]; then
echo "Error"
continue
fi
的存在
-否定运算符-表示如果字符串与正则表达式不匹配,它将打印“Error”,因此它将接受您提供的两个示例字符串-WH3Y4、
和H7UF5、
-并将拒绝任何其他内容。我想你想要的是
if [[ $myText =~ ^[A-Z0-9]{5},$ ]] ; then
echo "Error"
continue
fi
或者换句话说,只要去掉代码>
在第二种情况下
if ! [[ $myText =~ ^[A-Z0-9]{5} *[A-Za-z]$ ]]; then
echo "Error"
continue
fi
问题是正则表达式与数据不匹配。我建议你使用
if [[ $myText =~ ^[A-Z0-9]{5},[\ A-Za-z]+$ ]]; then
echo "Error"
continue
fi
请注意,我删除了代码>在这种情况下也是如此。我想你可以把它放在变量re='^[a-Z0-9]{5},$'
中,然后if![$myText=~re]];然后
所以当我尝试:[“$myText”=~^[A-Z0-9]{5},\$]]它也会在不应该的时候产生错误,当文本行的逗号后面有这样的单词:4WA16B7V722EC,testI认为$的想法是指示行的结尾,所以它基本上是逗号和行的结尾,但是如果该行继续使用更多字符,则它不应与错误条件相匹配。请参阅感谢您的帮助,但我不清楚当数据为WH3Y4(我的测试)时这是如何工作的,因为在这种情况下,它不应产生错误,但仍会产生错误。换句话说,我只希望在逗号后面没有任何内容时出现错误,但在这两种情况下都显示错误。哦,天哪,这是新手错误?!?!让我测试看看,但我怀疑你可能是对的。所以从第一个开始,[[$myText=~^[A-Z0-9]{5},$],它不会在应该的时候为[WH3Y4]产生错误,所以我被难住了。第二个也不起作用。抱歉,我认为它起作用了。