编写从文件读取搜索词执行grep的bash脚本遇括号不匹配错误如何解决
解决方案
核心错误原因
- 正则表达式语法不合法:你手动执行的命令中,为了匹配字面量左括号
(,对其做了转义处理\(,但脚本里的正则多写了多余的{}、/符号,且左括号没有转义,导致grep识别到未闭合的正则分组括号,抛出括号不匹配报错。 - grep命令未指定搜索路径,全局搜索需要传入目标根路径,比如全系统搜索就传
/。 - 未对读取到的搜索词做特殊字符转义:如果搜索词包含
.+*?()[]{}|^$等正则保留字符,会直接触发正则语法错误。
修正后脚本
input="../list.txt" # 可修改为你需要搜索的目标目录,全系统搜索就填 / search_root="/" while IFS= read -r line do # 转义搜索词中的正则特殊字符,避免语法错误 escaped_line=$(sed 's/[][\.+*?(){}|^$]/\\&/g' <<< "$line") # 拼接符合要求的正则,忽略权限报错的话可在命令末尾加 2>/dev/null grep -R -oE ".{0,5}${escaped_line}\(.{0,40}" "$search_root" echo "搜索完成:$line" done < "$input"
可选优化
如果不需要用到正则匹配,仅把搜索词当做纯字符串匹配,可以将grep的-E参数替换为-F,同时去掉搜索词转义逻辑即可。
内容的提问来源于stack exchange,提问作者rpthomps
相关产品推荐
相关产品推荐

