有变量的grep是否有任何自动转义方法?

时间:2014-03-04 14:47:59

标签: regex bash grep escaping

我在变量中有一个文本我希望完全匹配它,但它可能包含特殊字符(如点),我试图保证这样做:

MATCH=$(cat SOMEFILE | sed 's/\./\\./g')
LINES=$(grep "[[:space:]]$MATCH\$" OTHERFILE) # retrieves lines ending with the matched content

它现在有效,但我想知道是否有更好的方法?如果偶然MATCH包含另一个特殊字符[|或任何其他正则表达式?

1 个答案:

答案 0 :(得分:0)

我创建了自己的grep解决方案:

sgrep() {
    EXPR=
    while :; do
        [ "$1" == '--' ] && shift && break
        [ -z "$1" ] && break
        if [ "${1:0:2}" == '-t' ]; then
            EXPR="$EXPR$(echo "${1:2}" | sed 's/[][()\.^$?*+]/\\&/g')"
        elif [ "${1:0:2}" == '-e' ]; then
            EXPR="$EXPR${1:2}"
        else
            EXPR="$EXPR$1"
        fi
        shift || break
    done
    egrep "$EXPR" "$@"
}

使用示例:

sgrep -e^ -t192.168 -e[0-9.]*[[:space:]] -- /proc/net/arp

-t开头的所有内容都被视为文本并被转义,以-e开头的参数会连接到原始表达式以及其他情况,在第一个--到来之后grep 1}}参数本身。