是否存在与PHP的preg_match相当的shell?
我正在尝试从shell脚本中的此字符串中提取数据库名称。
define('DB_NAME', 'somedb');
在PHP中使用preg_match我可以做这样的事情。
preg_match('define(\'DB_NAME\','(.*)'\'\)',$matches);
echo $matches[1];
如何在shell脚本中完成相同的操作?
答案 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