如何在Bash脚本中筛选仅含'Inv'而非'InvCR'的路径?
解决grep匹配"Inv"时误包含"InvCR"的问题
你的问题出在grep -i "Inv"会匹配所有包含"Inv"的字符串,包括"InvCR"这类以"Inv"开头的更长字符。可以通过以下几种方式修正:
使用单词边界匹配:利用grep的单词边界元字符
\<和\>,确保"Inv"是独立的单词(不会被其他字母数字字符跟随)。替换原命令中的grep -i "Inv"为:grep -i "\<Inv\>"完整命令:
find /base/path/ -type d | grep -i "$1" | grep -i ".root" | grep -i "\<Inv\>" | grep -v "deleted"注:路径中的
/属于非单词字符,所以\<Inv\>会正确匹配xxx/Inv/xxx这类路径,不会匹配xxx/InvCR/xxx。匹配"Inv"后接非字母数字或字符串结尾:如果"Inv"后面可能跟非字母数字字符(比如下划线、斜杠),或者在路径末尾,可以用扩展正则表达式限定:
grep -Ei "Inv([^a-zA-Z0-9]|$)"完整命令:
find /base/path/ -type d | grep -i "$1" | grep -i ".root" | grep -Ei "Inv([^a-zA-Z0-9]|$)" | grep -v "deleted"合并多个grep提升效率:把多个过滤条件合并到一个grep命令中,减少管道次数:
find /base/path/ -type d | grep -vi "deleted" | grep -Ei "$1.*\.root.*\<Inv\>"注:如果
$1包含正则特殊字符,可能需要先转义,比如用sed 's/[.*+?^$(){}|[\]\\]/\\&/g' <<< "$1"处理后再使用。
内容的提问来源于stack exchange,提问作者ryse
相关产品推荐
相关产品推荐

