Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell ksh+;智能测试线解决方案_Shell_Awk_Ksh - Fatal编程技术网

Shell 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,

我 编写以下语法(ksh脚本的一部分) 检查行的第一个字是否=星 第二个词是汽车

     [[ ` 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"