2010-08-25 142 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"