Bash正则表达式:Grep for tilde'〜'和连字符' - '在数组循环上

时间:2015-08-08 22:26:18

标签: regex bash grep

我试图创建一个expect_commands bash函数来检查正则表达式是否存在于文件中:

function expect_commands 
{
        args_array=()
        for (( i = 2; i <= $#; i++ )); do
            args_array[i]=${!i}
            if grep -Fxqe "${args_array[$i]}" "$hist_file" || grep -Fxqe "${args_array[$i]}/" "$hist_file" || grep -Fxqe "${args_array[$i]} " "$hist_file" || grep -FxqE "${args_array[$i]}" "$hist_file"
            then
                response "$1" $COUNT
            else
                tell_error "$1" $COUNT
            fi
        done
}

使用以下参数调用该函数:

expect_commands "remove entire ~/workspace/test-website/css directory" "rm -r test-website/css" "rm -r test-website/css/" "rm -Rf ~/workspace/test-website/css" "rm -rf ~/workspace/test-website/css" "rm -R ~/workspace/test-website/css"

其中参数$1是任务。 从$2到结尾的参数是用户可以输入到终端的每种可能组合。

这些输入保存在~/.bash_history文件中,并使用grep从那里进行评估:

if grep -Fxqe "${args_array[$i]}" "$hist_file" || grep -Fxqe "${args_array[$i]}/" "$hist_file" || grep -Fxqe "${args_array[$i]} " "$hist_file" || grep -FxqE "${args_array[$i]}" "$hist_file"

该函数传递的输入如下:

rm -r test-website/css rm -r test-website/css/

但是当涉及到:

rm -Rf ~/workspace/test-website/css rm -rf ~/workspace/test-website/css rm -R ~/workspace/test-website/css

grep无法匹配这些行。

我有时遇到的一些错误是:

添加-FxqE选项时: grep: conflicting matchers specified

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您的功能可以简化:为什么需要一个数组来保存参数?

function expect_commands {
    local label=$1
    shift
    for arg do
        arg=$( sed "s/ ~/ $HOME/g" <<< "$arg" )    # translate ~ to $HOME
        if grep -Fxq -e "$arg" -e "$arg/" -e "$arg " "$HISTFILE"
        then
            response "$label" $COUNT
        else
            tell_error "$label" $COUNT
        fi
    done
}

什么是$COUNT?避免全局变量。