Unix grep多字符搜索

时间:2018-02-08 01:11:44

标签: bash unix grep

我正在解决unix bash中的一个问题,它希望我从用户那里得到一个输入,然后查找输入是否有效(即只包含AZ az和_下划线字符)并拒绝任何带有字符的内容除了那些。例如,Space_oddity有效,而Space_oddity132无效。我无法弄清楚grep命令的语法是什么

if        $1 | grep '[A-Za-z_]'
echo "name is valid"
else
echo "name is not valid"
fi

我认为我应该在grep命令中使用{m,},但是尽管查看了正则表达式命令列表,但我无法获得正确的语法。任何人都可以帮助我获得正确的语法或发布更有助于理解语法的内容然后到目前为止我发现了什么?

2 个答案:

答案 0 :(得分:0)

便携式方法

case语句可以完成此任务,它是POSIX,因此具有可移植性的优势:

#!/bin/sh
case "$1" in
    *[^[:alpha:]_]* )
        echo "name is not valid" ;;
    *)
        echo "name is valid" ;;
esac

这是有效的,因为如果$1包含任何不允许的字符,则该字符将与[^[:alpha:]_]匹配,并且将显示not valid消息。

Bash-Only Method 1

使用类似的逻辑,但使用bash的[[...]]测试命令:

if [[ $1 = *[^[:alpha:]_]* ]]
then
    echo "name is not valid"
else
    echo "name is valid"
fi

Bash-Only Method 2

或者,根据Benjamin W的建议,我们可以替换删除所有有效字符,然后测试结果字符串是否为空:

if [[ ${1//[[:alpha:]_]} ]]
then
    echo "Name is not valid"
else
    echo "Name is valid"
fi

答案 1 :(得分:0)

如果您想使用grep而不是case,请确保将字符串作为grep的输入提供,并修正正则表达式:

if echo "$1" | grep -E -q '^[_[:space:]]+$'
then echo "Name is valid [$1]"
else echo "Name is invalid [$1]"
fi

-E选项启用扩展正则表达式(egrep模式)。因+而需要;或者,省略-E并使用'^[_[:space:]][_[:space:]]*$'作为正则表达式。两种符号都坚持在开头和结尾之间至少有一个字符。 [:space:]表示法是标准POSIX。 -q选项会抑制所有正常输出;它告诉您是否找到了模式(退出状态0,成功)或不是(退出状态不是0)。消息也会打印出已验证的名称;特别是在调试过程中它会有所帮助(即使在此之后也常常有用)。

请注意,我使用echo "$1"来避免空格等问题。这里并不重要,但通常最安全的方法是将$variable符号括在双引号中。请注意,有时候这不是使用变量的正确方法,但这通常是最好的方法。