2010-08-25 140 views
1

我 写的语法如下(我的ksh脚本的一部分) 检查,如果行的第一个字=明星 ,第二个字是汽车KSH +智能测试线解决方案

 [[ ` echo $LINE | awk '{print $1}' ` = star ]] && [[ ` echo $LINE | awk '{print $2}' ` = car ]] && print "match" 

我需要其他的简单聪明和更短的解决方案,然后我的语法 来自awk,perl或sed(如果我们不能使用回声,只能使用回声一次或更好,因为我需要将时间节省到最小) 我可以得到一些想法吗?

+0

如果性能是一个问题,ksh可能是您实施的错误选择。 – 2010-08-25 10:59:35

回答

1

你实际上并不需要调用任何外部工具

set -f 
set -- $LINE 
case "$1 $2" in 
"star car") 
    echo "match";; 
esac 
+0

@ ghostdog74:当它不应该时,它有时会匹配,例如,'LINE ='star *''。如果你先设置了'-f',就可以关闭'$ LINE'的无引号替换的glob扩展(如果你改变搜索的字符串,甚至是脆弱的,因为一些反斜杠总是在未加引号的替换中扩展) 。 – Gilles 2010-08-25 23:16:49

0

你可以这样做:

[[ ` echo $LINE | awk '{printf("%s:%s",$1,$2)}'` = star:car ]] && print "match" 
+0

与[ghostdog74](http://stackoverflow.com/questions/3563349/ksh-smart-test-line-solution/3563752#3563752)相同的问题,再加上调用awk与问题中的速度要求相矛盾。 – Gilles 2010-08-25 23:19:21

1

你并不需要在所有外部进程:

[[ $LINE == *([ ])star+([ ])car?([ ]*) ]] 

如果您还需要有时提取的第一个字(警告,直接键入浏览器):

LINE=${LINE##+[ ]} # strip leading spaces 
first_word=${LINE%%[ ]*} 
if [[ $LINE = *[ ]* ]]; then 
    LINE_minus_first_word=${LINE##*+([ ])} 
else 
    LINE_minus_first_word='' 
fi 

添加选项卡中的括号内,如果他们可能会出现在$LINE

+0

你应该提到这些需要'shopt -s extglob'。 – 2010-08-26 02:31:48

+0

我应该说“...为Bash”,因为他们总是开着ksh。 – 2010-08-26 03:20:46

1
set -o noglob 
words=($LINE) 
[[ "${words[0]} ${words[1]}" == "star car" ]] && print "match" 

编辑:

使用KSH和Bash的正则表达式匹配(击> =版本3.2):

pattern='^[[:blank:]]*star[[:blank:]]+car([[:blank:]]+|$)' 
[[ $LINE =~ $pattern ]] && print "match"