我 编写以下语法(我的ksh脚本的一部分) 检查LINE的第一个单词是否为星号 第二个词是汽车
[[ ` echo $LINE | awk '{print $1}' ` = star ]] && [[ ` echo $LINE | awk '{print $2}' ` = car ]] && print "match"
我的语法需要其他简单的智能和更短的解决方案。 来自awk,perl或sed(如果我们不能使用echo,可能只使用一次或更好的回声,因为我需要节省时间到最小) 我可以得到一些想法吗?
答案 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"