【问题标题】:ksh + smart test line solutionksh+智能测试线解决方案
【发布时间】:2011-04-03 13:31:28
【问题描述】:

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

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

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

【问题讨论】:

  • 如果性能是一个很大的问题,也许 ksh 是您实施的错误选择。

标签: shell awk ksh


【解决方案1】:

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

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

【讨论】:

  • @ghostdog74:这有时会在不应该匹配的情况下匹配,例如LINE='star *'。如果您首先执行set -f,它会在$LINE 的未引用替换上关闭全局扩展(如果您更改搜索的字符串,即使这样也很脆弱,因为某些反斜杠总是在未引用的替换中扩展)。跨度>
【解决方案2】:

您根本不需要外部进程:

[[ $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 中,请在括号内添加一个选项卡。

【讨论】:

  • 你应该提到这些需要shopt -s extglob
  • 我应该说“...for Bash”,因为它们总是为 ksh 启用。
【解决方案3】:
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"

【讨论】:

    【解决方案4】:

    你可以这样做:

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

    【讨论】:

    • ghostdog74 相同的问题,加上调用 awk 与问题中的速度要求相矛盾。
    猜你喜欢
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    相关资源
    最近更新 更多