我有这个egrep搜索:
egrep -is "(ABC-[0-9]+)"
将ABC-123与字符串中的任何位置匹配。
我希望它忽略XABC-456或YABC-789。
换句话说,这些例子应输出“ok”:
echo "ABC-123" | egrep -is "(ABC-[0-9]+)" && echo "ok"
echo "test ABC-123" | egrep -is "(ABC-[0-9]+)" && echo "ok"
但这不应该:
echo "XABC-123" | egrep -is "(<fill in>ABC-[0-9]+)" && echo "ok"
我试了这个没有运气(没有输出):
echo "ABC-123" | egrep -is "(\bABC-[0-9]+)" && echo "ok"
(我正在运行Solaris 10)
我该怎么做?
答案 0 :(得分:4)
看起来您正在寻找\bABC-[0-9]+
- Word Boundaries。
另一种选择是使用negetive lookbedind,whci可让您更好地控制匹配前可以和不可以的内容:(?<![a-z])ABC-[0-9]+
。
答案 1 :(得分:2)
这应该做:
^(ABC-[0-9]+)
通过这种方式,您告诉您希望该行以正则表达式开头。
答案 2 :(得分:1)
尝试以下方法:
echo "XABC-123" | egrep -is "(\bABC-[0-9]+)" && echo "ok"
有一些解决方案建议使用^(以...开头)但是,如果您正在查看“ABC-123”,它们将会失败,您可能想要捕获它们。字边界可能就是你想要的,除非你正在寻找以...开头的
以下是一些示例输出:
tim@Ikura ~
$ echo " ABC-123" | egrep -is "(\bABC-[0-9]+)" && echo "ok"
ABC-123
ok
tim@Ikura ~
$ echo "ABC-123" | egrep -is "(\bABC-[0-9]+)" && echo "ok"
ABC-123
ok
tim@Ikura ~
$ echo "XABC-123" | egrep -is "(\bABC-[0-9]+)" && echo "ok"
tim@Ikura ~
$
更新: Solaris问题......“搜索单词并不像第一次出现那么简单。字符串”the“将匹配单词”other“。你可以把字母之前和之后的空格并使用这个正则表达式:“the”。但是,这与行的开头或结尾处的单词不匹配。并且它与单词后面有标点符号的情况不匹配。< / p>
有一个简单的解决方案。字符“\&lt;”和“&gt;”类似于“^”和“$”锚点,因为它们不占据角色的位置。它们确实“锚定”它们之间的表达式,只有当它在单词边界上时才匹配。搜索单词“the”的模式将是“\&lt; [tT] he&gt;”。 “t”之前的字符必须是新行字符,或除字母,数字或下划线之外的任何字符。 “e”后面的字符也必须是数字,字母或下划线以外的字符,或者它可以是行尾字符。“
tim@Ikura ~
$ echo "XABC-123" | egrep -is "(\<ABC-[0-9]+\>)" && echo "ok"
tim@Ikura ~
$ echo " ABC-123" | egrep -is "(\<ABC-[0-9]+\>)" && echo "ok"
ABC-123
ok
答案 3 :(得分:1)
如果\b
不适合您,您是否尝试过((^| )ABC-[0-9]+)
?
答案 4 :(得分:0)
echo "XABC-123" | egrep -is "^ABC-[0-9]+" && echo "ok"
编辑:接受ABC
除了字母之前的任何内容时:
echo "XABC-123" | egrep -is "(^|[^A-Z])ABC-[0-9]+" && echo "ok"