使用grep匹配以字面量[200]结尾的行遇到的问题求助
如何用grep筛选以
[200]结尾的行? 我太懂这种转义搞砸的困惑了——grep的正则语法和shell的字符解析经常会“打架”,稍不注意就出问题。咱们先理清楚你遇到的问题,再给出靠谱的解决办法。
首先先明确你的文件内容:
hello_400 [200] world_678 [201] this [301] is [302] your [200] friendly_103 [404] utility [200] grep [200]
为什么你之前的命令不对?
第一个命令
cat file | grep \[200\]
这里的问题是shell会先解析你的反斜杠——单个\在shell里会被吃掉,最终传给grep的其实是[200]。而在正则表达式里,[xxx]表示“匹配括号里任意一个字符”,所以[200]会匹配所有包含2或0的行,自然就全中了。第二个命令
cat file | grep \\[200\\]$
这里你加了两个反斜杠,但shell还是会把每一对\\转换成单个\,再加上行尾$的解析干扰,最终传给grep的正则逻辑并不准确,所以才会出现无匹配的情况。
正确的解决办法
最稳妥、最不容易出错的方式是用单引号把正则表达式包起来,这样shell就不会解析里面的任何特殊字符,直接原封不动传给grep:
grep '\[200\]$' file
\[和\]:在正则里转义[和](因为它们是正则的特殊字符,用来定义字符组)$:表示匹配行的结尾- 单引号:彻底避免shell干扰正则的转义逻辑
执行这个命令后,你会得到正确的结果:
hello_400 [200] your [200] utility [200] grep [200]
其他可选方案
如果你不想用单引号,也可以用双重转义(让shell解析后传给grep正确的转义字符),但写法比较繁琐:
grep \\\[200\\\]$ file
这里每两个\\会被shell转换成一个\,最终grep拿到的还是\[200\]$,效果和上面一样,但可读性差很多。
另外,你也可以用awk来实现,它的正则处理逻辑更直观:
awk '/\[200\]$/' file
内容的提问来源于stack exchange,提问作者Kavish Gour
相关产品推荐
相关产品推荐

