关于grep的两个问题:范围查询中引号的使用及特定模式的正则匹配
关于grep的两个问题:范围查询中引号的使用及特定模式的正则匹配
嗨,我来帮你搞定这个grep的匹配难题~你要找的(f'、(f"、('、("这些模式,对应的正则(f?["']是对的,但卡在了shell里引号的处理上对吧?别慌,给你几个实用的解决办法:
方法一:用双引号包裹正则,转义内部的双引号
shell里双引号内的双引号可以用反斜杠转义,同时记得加-E选项开启扩展正则(这样?可以直接用,不用转义)。如果用基础正则的话,需要把?转义成\?。命令示例:# 扩展正则写法(推荐) grep -E "(f?[\"']" your_file.txt # 基础正则写法(无需-E) grep "(f\?[\"']" your_file.txt方法二:用单引号拼接处理单引号
单引号在shell里会完全保留内部内容,但单引号本身不能直接放在单引号里,我们可以用'\''来表示一个单引号(原理是:先关闭单引号,输出转义的单引号,再重新打开单引号)。这样就能用单引号包裹整个正则,避免双引号的干扰:grep -E '(f?["'\''"]' your_file.txtshell解析后,正则部分就会变成你需要的
(f?["'],完美匹配目标模式。方法三:把正则写入文件,用-f选项读取
如果觉得转义太繁琐,直接把正则(f?["']保存到一个文件(比如pattern.txt),然后用grep的-f选项读取这个文件里的规则,完全避开shell引号的冲突问题:# 先将正则写入文件 echo '(f?["']' > pattern.txt # 执行grep匹配 grep -f pattern.txt your_file.txt
这几种方法都能准确匹配你要的四种模式,你可以根据自己的习惯选择其中一种来使用~
备注:内容来源于stack exchange,提问作者Ivan Dimitrov
相关产品推荐
相关产品推荐

