Ksh + Smart Test Line решение - PullRequest
       5

Ksh + Smart Test Line решение

1 голос
/ 25 августа 2010

Я пишу следующий синтаксис (часть моего сценария ksh), чтобы проверить, является ли первое слово LINE = star, а второе слово car

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

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

Ответы [ 4 ]

1 голос
/ 25 августа 2010
set -o noglob
words=($LINE)
[[ "${words[0]} ${words[1]}" == "star car" ]] && print "match"

Редактировать:

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

pattern='^[[:blank:]]*star[[:blank:]]+car([[:blank:]]+|$)'
[[ $LINE =~ $pattern ]] && print "match"
1 голос
/ 25 августа 2010

Вам вообще не нужен внешний процесс:

[[ $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.

1 голос
/ 25 августа 2010

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

set -f 
set -- $LINE
case "$1 $2" in 
 "star car") 
    echo "match";;
esac
0 голосов
/ 25 августа 2010

Вы можете сделать:

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