代码之家  ›  专栏  ›  技术社区  ›  Andrew Hopper

Shell等价于php preg_match?

  •  6
  • Andrew Hopper  · 技术社区  · 17 年前

    是否有与php的preg_匹配的shell等价物?

    我正试图用shell脚本从这个字符串中提取数据库名称。

    define('DB_NAME', 'somedb');
    

    在PHP中使用preg_match,我可以做类似的事情。

    preg_match('define(\'DB_NAME\','(.*)'\'\)',$matches);
    echo $matches[1];
    

    如何在shell脚本中完成相同的事情?

    6 回复  |  直到 12 年前
        1
  •  2
  •   DigitalRoss    17 年前
    $ t="define('DB_NAME', 'somedb');"
    $ echo $t
    define('DB_NAME', 'somedb');
    $ eval "result=(${t##*,}"
    $ echo $result
    somedb
    $ 
    

    它确实包含了一个bashim,虽然它可以在大多数开箱即用的环境中工作,但要坚持使用posix shell特性,可以使用更笨拙的版本:

    t="define('DB_NAME', 'somedb');"
    r="${t##*,}"
    r="${r%);*}"
    r=`eval echo $r`
    
        2
  •  2
  •   too much php    17 年前

    怎么样:

    $ str="define('DB_NAME', 'somedb');"
    $ php -r "$str echo DB_NAME;"
    somedb
    
        3
  •  2
  •   Pierre-Olivier Vares Inoryy    12 年前

    使用expr精确回答问题:

    expr match "string" "regexp"
    

    因此,为了您的需要,您可以写:

    expr match "$mystring" "define('DB_NAME', '\([^']\+\)');"
    

    注意 \( \) 一对。 如果没有这些字符,expr将返回匹配的字符数。 使用它们,只返回匹配的部分。

    $ string="define('DB_NAME', 'toto');"
    $ expr match "$string" "define('DB_NAME', '[^']\+');"
    26
    
    $ string="define('DB_NAME', 'toto');"
    $ expr match "$string" "define('DB_NAME', '\([^']\+\)');"
    toto
    

    不过,我不知道expr在哪些环境下可用(并且具有这种行为)。

        4
  •  1
  •   Brenton Alker    17 年前

    这可能是你想要的

    sed -e "/DB_NAME/ s/define('DB_NAME', '\(.*\)');/\1/" /path/to/file/to/search.txt
    
        5
  •  0
  •   Chmouel Boudjnah    17 年前

    像这样:

    MATCHED=$(sed -n "s/^define('DB_NAME', '\(.*\)')/\1/p" file.php)
    
    if [[ -n ${MATCHED} ]];then
      echo $MATCHED
    else
      echo "No match found"
    fi
    
        6
  •  0
  •   ghostdog74    17 年前

    只需使用case/esac结构

    mystring="define('DB_NAME', 'somedb');"
    case $mystring in
        *define*DB_NAME*) 
          dbname=${mystring%\'*}
          dbname=${dname##*\'}
          echo "$dbname" ;;
    esac