ksh +智能测试线解决方案

时间:2010-08-25 06:29:43

标签: shell awk ksh

我 编写以下语法(我的ksh脚本的一部分) 检查LINE的第一个单词是否为星号 第二个词是汽车

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

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

4 个答案:

答案 0 :(得分: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

中,请在括号内添加一个标签

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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"

答案 3 :(得分:0)

你可以这样做:

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