2010-08-25 17 views
1

Je écrire la syntaxe suivante (partie de mon script ksh) pour vérifier si le premier mot de la ligne = étoile et le second mot est la voitureksh + solution ligne de test intelligent

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

J'ai besoin d'autres solution intelligente simple et plus courte, puis ma syntaxe. de awk, perl ou sed (s'il est possible d'utiliser echo une seule fois ou mieux si on ne peut pas utiliser echo, parce que j'ai besoin de gagner du temps au minimum) puis-je avoir des idées?

+0

Si les performances constituent un problème majeur, ksh n'est peut-être pas le bon choix pour votre implémentation. –

Répondre

1

vous n'avez pas réellement besoin d'appeler des outils externes

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

@ ghostdog74: Cela correspond parfois quand il ne le devrait pas, par exemple, avec 'LINE =' star * ''. Cela fonctionnerait si vous avez d'abord 'set -f', pour désactiver l'expansion glob sur la substitution non cotée de' $ LINE' (et même cela est fragile si vous changez les chaînes recherchées, parce que certaines barres obliques inverses sont toujours développées dans les substitutions sans guillemets) . – Gilles

0

Vous pouvez faire: besoin

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

Si vous aussi d'extraire le premier mot parfois (avertissement, tapé directement dans le:

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

même problème que [ghostdog74] (http://stackoverflow.com/questions/3563349/ksh-smart-test-line-solution/3563752#3563752), plus appeler awk contredit l'exigence de vitesse dans la question. – Gilles

1

Vous n'avez pas besoin d'un processus externe du tout navigateur):

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

Ajouter un onglet à l'intérieur des parenthèses si elles peuvent apparaître dans $LINE.

+0

Vous devez mentionner que ceux-ci nécessitent 'shopt -s extglob'. –

+0

J'aurais dû dire "... pour Bash" car ils sont toujours activés pour ksh. –

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

Edit:

En utilisant ksh et la correspondance des expressions rationnelles de Bash (Bash> = Version 3.2):

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