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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top