2010-08-25 3 views
1

я написать следующий синтаксис (часть моего КШ сценария) , чтобы проверить, если первое слово ЛИНИИ = звезда и второго слово автомобильКШ + смарт-тест линия решения

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

мне нужна другая простое умное и более короткое решение, а затем мой синтаксис. от awk, perl или sed (если можно использовать эхо только один раз или лучше, если мы не можем использовать эхо, потому что мне нужно сэкономить время до минимума) Могу ли я получить некоторые идеи?

+0

Если производительность - это большая часть проблемы, возможно, ksh является неправильным выбором для вашей реализации. –

ответ

1

вы на самом деле не нужно вызывать какие-либо внешние инструменты

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

@ ghostdog74: Это иногда будет совпадать, если это не должно быть, например, с 'LINE = 'star *''. Это сработает, если вы сначала установили -f', чтобы отключить расширение glob на некотируемую подстановку '$ LINE' (и даже это хрупко, если вы измените искомые строки, потому что некоторые обратные косые черты всегда расширяются в некотируемых подстановках) , – Gilles

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

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'. –

+0

Я должен был сказать «... для Баша», так как они всегда включены для ksh. –

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

Edit:

Использование Ksh и сопоставления регулярных выражений в Bash (Bash> = версия 3.2):

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