如何使用grep命令忽略包含$(特殊字符的mk文件行?
解决grep过滤包含
$(的行的问题 问题场景
假设你有以下mk文件内容输出:
/XGenerator.mk:98:LOCAL_MODULE := filesxml.sh
/XGenerator.mk:106:LOCAL_MODULE := doublefiles.sh
/LibParameter.mk:35:LOCAL_MODULE := libparameter$(SUFFIX)
/LibUtility.mk:35:LOCAL_MODULE := libpfw_utility$(SUFFIX)
你希望过滤掉包含$(的行,得到如下结果:
/XGenerator.mk:98:LOCAL_MODULE := filesxml.sh
/XGenerator.mk:106:LOCAL_MODULE := doublefiles.sh
但尝试了以下两个命令都没生效:
- 尝试1:
grep -Rin "LOCAL_MODULE :=" --include="*.mk" | grep -v '$(' - 尝试2:
grep -Rin "LOCAL_MODULE :=" --include="*.mk" | grep -v '/$/('
问题原因
你之前的命令失败有两个核心原因:
- Shell的特殊字符解析:
$(在shell中是命令替换的语法,直接写$(而没有正确引用的话,shell会尝试执行它,导致传给grep的参数不是你预期的字面字符串。 - Grep正则的特殊字符:在grep的基础正则表达式中,
$是行尾的锚点符号,直接写$(会被grep当作正则语法解析,而不是字面匹配$(这个字符串。
解决方案
可以用以下几种方法实现需求:
方法1:使用固定字符串匹配(推荐)
用grep -F(等价于fgrep)来匹配固定字符串,这样grep不会把$(当作正则符号解析:
grep -Rin "LOCAL_MODULE :=" --include="*.mk" | grep -Fv '$('
-F参数告诉grep按固定字符串匹配,-v表示反向匹配(排除符合条件的行)。
方法2:转义正则中的特殊字符
如果你想用正则匹配,需要转义$(在基础正则中,$是特殊锚点,必须转义):
grep -Rin "LOCAL_MODULE :=" --include="*.mk" | grep -v '\$\('
这里用\$转义$,确保grep把它当作字面字符处理,(在基础正则中无需转义,但一起转义也不影响结果。
方法3:用双引号包裹并转义
如果习惯用双引号,需要对$和(都进行转义,避免shell解析:
grep -Rin "LOCAL_MODULE :=" --include="*.mk" | grep -v "\$\("
验证效果
执行上述任一命令后,都会输出你期望的两行结果,成功过滤掉包含$(的行。
内容的提问来源于stack exchange,提问作者Dinesh Ravi
相关产品推荐
相关产品推荐

