Shell-Äquivalent von PHP preg_match?
Frage
Gibt es ein Shell-Äquivalent von PHP preg_match?
Ich versuche, die Datenbanknamen aus dieser Zeichenfolge in einem Shell-Skript zu extrahieren.
define('DB_NAME', 'somedb');
Mit preg_match in PHP konnte ich nur so etwas tun.
preg_match('define(\'DB_NAME\','(.*)'\'\)',$matches);
echo $matches[1];
Wie kann ich die gleiche Sache in einem Shell-Skript erreichen?
Lösung
$ t="define('DB_NAME', 'somedb');"
$ echo $t
define('DB_NAME', 'somedb');
$ eval "result=(${t##*,}"
$ echo $result
somedb
$
tut, dass man eine bashism enthalten, und während es in den meisten out-of-the-box-Umgebungen arbeiten, mit Posix-Shell-Funktionen zu halten, führen Sie die clunkier Version:
t="define('DB_NAME', 'somedb');"
r="${t##*,}"
r="${r%);*}"
r=`eval echo $r`
Andere Tipps
Wie wäre:
$ str="define('DB_NAME', 'somedb');"
$ php -r "$str echo DB_NAME;"
somedb
Die Verwendung von ausdr Antworten genau auf die Frage:
expr match "string" "regexp"
Also, für Ihren Bedarf, können Sie schreiben:
expr match "$mystring" "define('DB_NAME', '\([^']\+\)');"
Beachten Sie die \( \)
Paar.
Ohne diese Zeichen, ausdr wird die Anzahl der gefundenen Zeichen zurück.
Mit ihnen wird nur noch das passende Teil zurückgegeben.
$ string="define('DB_NAME', 'toto');"
$ expr match "$string" "define('DB_NAME', '[^']\+');"
26
$ string="define('DB_NAME', 'toto');"
$ expr match "$string" "define('DB_NAME', '\([^']\+\)');"
toto
Ich weiß nicht, unter welchen Umgebungen ausdr verfügbar ist (und hat dieses Verhalten), though.
Dies könnte tun, was Sie wollen
sed -e "/DB_NAME/ s/define('DB_NAME', '\(.*\)');/\1/" /path/to/file/to/search.txt
so etwas wie folgt aus:
MATCHED=$(sed -n "s/^define('DB_NAME', '\(.*\)')/\1/p" file.php)
if [[ -n ${MATCHED} ]];then
echo $MATCHED
else
echo "No match found"
fi
verwenden nur den Fall / esac Konstrukt
mystring="define('DB_NAME', 'somedb');"
case $mystring in
*define*DB_NAME*)
dbname=${mystring%\'*}
dbname=${dname##*\'}
echo "$dbname" ;;
esac