【问题标题】:syntax error executing regex on bash在 bash 上执行正则表达式的语法错误
【发布时间】:2014-06-07 09:43:10
【问题描述】:

我有以下小代码来检索文件名,

    for pfile in ../data/${BENCH}/*.data; do
        prot=`expr match ${pfile%.data} "../data/${BENCH}/\(.*\)"`
        echo ${prot}
    done

pfile%.data 是一个类似“../data/gpcr/3.4.5.data”的字符串。但是,此表达式返回“语法错误”。

我也试过了,

prot=`expr match "${pfile%.data}" "../data/${BENCH}/\(.*\)"`   AND
prot=`expr match "${pfile%.data}" : "../data/${BENCH}/\(.*\)"` AND
prot=`expr match "${pfile%.data}" '../data/${BENCH}/\(.*\)'`   

他们都没有工作。我在 MacOSX 终端上运行这些。

提前致谢。

【问题讨论】:

  • expr match "${pfile%.data}" "../data/${BENCH}/\(.*\)" 应该做什么?
  • 它应该检索 pfile%.data 的“3.4.5”部分,即“../data/gpcr/3.4.5.data”

标签: regex bash terminal


【解决方案1】:

根据https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/expr.1.html,需要去掉“match”关键字,这个实现中是不存在的

prot=$(expr ${pfile%.data} : "../data/${BENCH}/\(.*\)")

但是既然你有 bash:

prot=${pfile%.data}
prot=${prot##*/}
echo "$prot"

或者你可以这样做:

prot=$( basename "$pfile" ".data" )

【讨论】:

    【解决方案2】:

    这对你有用吗?

    for pfile in ../data/$BENCH/*.data; do
        [[ $pfile =~ ^../data/$BENCH/(.*).data$ ]]
        prot=${BASH_REMATCH[1]}
        echo "$prot"
    done
    

    (我猜这就是您试图用 expr match 语句表达的意思)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 2011-10-13
      相关资源
      最近更新 更多