Shell ksh+;智能测试线解决方案
我 编写以下语法(ksh脚本的一部分) 检查行的第一个字是否=星 第二个词是汽车Shell ksh+;智能测试线解决方案,shell,awk,ksh,Shell,Awk,Ksh,我 编写以下语法(ksh脚本的一部分) 检查行的第一个字是否=星 第二个词是汽车 [[ ` echo $LINE | awk '{print $1}' ` = star ]] && [[ ` echo $LINE | awk '{print $2}' ` = car ]] && print "match" 我需要其他简单的智能和简短的解决方案,然后我的语法。 来自awk、perl或sed(如果可以只使用一次echo,或者如果我们不能使用echo,
[[ ` echo $LINE | awk '{print $1}' ` = star ]] && [[ ` echo $LINE | awk '{print $2}' ` = car ]] && print "match"
我需要其他简单的智能和简短的解决方案,然后我的语法。
来自awk、perl或sed(如果可以只使用一次echo,或者如果我们不能使用echo,则更好,因为我需要将时间节省到最低限度)
我能想出一些主意吗?你可以:
[[ ` echo $LINE | awk '{printf("%s:%s",$1,$2)}'` = star:car ]] && print "match"
您根本不需要外部流程:
[[ $LINE == *([ ])star+([ ])car?([ ]*) ]]
如果有时还需要提取第一个单词(警告,直接在浏览器中键入):
如果它们可能出现在
$LINE
中,请在括号内添加一个选项卡。实际上,您不需要调用任何外部工具
set -f
set -- $LINE
case "$1 $2" in
"star car")
echo "match";;
esac
编辑:
使用ksh和Bash的正则表达式匹配(Bash>=版本3.2):
如果性能是一个很大的问题,那么对于您的实现来说,ksh可能是一个错误的选择。@ghostdog74:这有时会在不应该的时候匹配,例如,与
LINE='star*'
匹配。如果您先设置-f,在$LINE
的非引号替换上关闭glob扩展(如果您更改搜索的字符串,即使这样也很脆弱,因为某些反斜杠总是在非引号替换中展开)。与,另外,调用awk与问题中的速度要求相矛盾。您应该提到,这些要求shopt-s extglob
。我应该说“…对于Bash”,因为它们对于ksh总是处于启用状态。
set -f
set -- $LINE
case "$1 $2" in
"star car")
echo "match";;
esac
set -o noglob
words=($LINE)
[[ "${words[0]} ${words[1]}" == "star car" ]] && print "match"
pattern='^[[:blank:]]*star[[:blank:]]+car([[:blank:]]+|$)'
[[ $LINE =~ $pattern ]] && print "match"