shell相当于php preg_match?

时间:2009-09-15 04:29:30

标签: php regex shell grep

是否存在与PHP的preg_match相当的shell?

我正在尝试从shell脚本中的此字符串中提取数据库名称。

define('DB_NAME', 'somedb');

在PHP中使用preg_match我可以做这样的事情。

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

如何在shell脚本中完成相同的操作?

6 个答案:

答案 0 :(得分:2)

怎么样:

$ str="define('DB_NAME', 'somedb');"
$ php -r "$str echo DB_NAME;"
somedb

答案 1 :(得分:2)

$ t="define('DB_NAME', 'somedb');"
$ echo $t
define('DB_NAME', 'somedb');
$ eval "result=(${t##*,}"
$ echo $result
somedb
$ 

那个确实包含了一种基础,虽然它可以在大多数开箱即用的环境中使用,但是为了坚持使用posix shell功能,可以使用笨重的版本:

t="define('DB_NAME', 'somedb');"
r="${t##*,}"
r="${r%);*}"
r=`eval echo $r`

答案 2 :(得分:2)

使用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在哪个环境下可用(并且有这种行为)。

答案 3 :(得分:1)

这可能会做你想要的事情

sed -e "/DB_NAME/ s/define('DB_NAME', '\(.*\)');/\1/" /path/to/file/to/search.txt

答案 4 :(得分:0)

类似的东西:

MATCHED=$(sed -n "s/^define('DB_NAME', '\(.*\)')/\1/p" file.php)

if [[ -n ${MATCHED} ]];then
  echo $MATCHED
else
  echo "No match found"
fi

答案 5 :(得分:0)

只使用case / esac构造

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