我确定这个问题的某些版本之前已经被问过和回答过,但我环顾四周并没有找到确切的答案。也许这里有人可以帮我点亮灯泡。我在 Mac 上使用 Mojave 10.14.6 和 bash 3.2.57(1)-release。
我正在通过在线教程学习正则表达式的基础知识,并在在线网站https://regexr.com上练习,并grep在我的本地机器上使用bash。
我正在练习一个包含三个内容的小文本文件(称为 small.txt):
9.00
9-00
9500
Run Code Online (Sandbox Code Playgroud)
我知道.通配符将匹配该位置的任何一个字符。因此,在我使用的在线正则表达式引擎 (JavaScript) 中, /9.00/g将匹配所有三个字符串9.00 9-00和9500.
如果我grep在命令行上使用也是一样的:
~/bin $ grep 9.00 small.txt
9.00
9-00
9500
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好。教程说,要将.元字符转换为文字,您必须对其进行转义。好的。所以放入/9\.00/g在线正则表达式框只会匹配9.00,正如预期的那样,而不是 9-00 或 9500。太好了。
但是,如果我grep在命令行中输入相同的语法,则会得到意想不到的结果:
~/bin $ grep 9\.00 small.txt
9.00
9-00
9500
Run Code Online (Sandbox Code Playgroud)
和之前一样。为了开始grep工作,我要么必须双引号整个字符串:
~/bin $ grep "9\.00" small.txt
9.00
Run Code Online (Sandbox Code Playgroud)
或者只是双引号转义字符:
~/bin $ grep 9"\."00 small.txt
9.00
Run Code Online (Sandbox Code Playgroud)
很可能还有其他一些我可以做出的引用选择,这也会给我正确的结果。
这让我很难理解正则表达式的基础知识,因为很明显,我首先必须了解 …