如何用grep匹配注释字符串?当前命令失效原因及解决办法
为什么你的grep命令匹配不到README里的模板注释?
嘿,这问题我熟~你踩的是grep正则匹配的常见小坑。
问题根源
grep默认使用基础正则表达式(BRE),你要匹配的字符串[//]: # (Template README)里的[、]、(、)都是BRE里的特殊元字符:
[]用来定义字符集合(比如[a-z]匹配小写字母)()用来做分组匹配
直接写这些符号的话,grep会把它们当成正则语法解析,而不是你要找的字面量字符,自然匹配不到目标字符串。
两种解决方法
方法一:固定字符串匹配(最省心)
直接用grep -F选项,这个选项会把整个搜索内容当作纯字面量,完全忽略正则元字符,相当于fgrep的功能。修改后的代码如下:
readme_file=./README.md if grep -qF "[//]: # (Template README)" "$readme_file"; then echo "match" fi
这种方式不管字符串里有多少特殊符号,都会原封不动地去匹配,绝对不会出错,推荐优先用这个。
方法二:转义正则元字符(适合需要正则扩展的场景)
如果你确实需要用正则匹配(比如后面要加更复杂的匹配规则),就得给所有特殊元字符加反斜杠\,让grep把它们当作普通字符处理:
readme_file=./README.md if grep -q "\[\//\]: # \(Template README\)" "$readme_file"; then echo "match" fi
这里我们转义了[→\[、]→\]、(→\(、)→\),/其实不需要转义,但转了也不影响结果。
如果你习惯用扩展正则表达式(ERE),可以加-E选项,此时()依然需要转义,[]也一样:
readme_file=./README.md if grep -qE "\[\//\]: # \(Template README\)" "$readme_file"; then echo "match" fi
内容的提问来源于stack exchange,提问作者markzzz
相关产品推荐
相关产品推荐

