Оболочечный эквивалент php preg_match? - PullRequest
6 голосов
/ 15 сентября 2009

Есть ли оболочка, эквивалентная PHP preg_match?

Я пытаюсь извлечь имя базы данных из этой строки в сценарии оболочки.

define('DB_NAME', 'somedb');

Используя preg_match в PHP, я мог просто сделать что-то вроде этого.

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

Как мне сделать то же самое в сценарии оболочки?

Ответы [ 6 ]

2 голосов
/ 10 декабря 2013

Использование 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 (и имеет такое поведение).

2 голосов
/ 15 сентября 2009
$ t="define('DB_NAME', 'somedb');"
$ echo $t
define('DB_NAME', 'somedb');
$ eval "result=(${t##*,}"
$ echo $result
somedb
$ 

В этой версии есть bashism, и, хотя она будет работать в большинстве готовых сред, для использования функций оболочки posix сделайте более грубую версию:

t="define('DB_NAME', 'somedb');"
r="${t##*,}"
r="${r%);*}"
r=`eval echo $r`
2 голосов
/ 15 сентября 2009

Как насчет:

$ str="define('DB_NAME', 'somedb');"
$ php -r "$str echo DB_NAME;"
somedb
1 голос
/ 15 сентября 2009

Это может делать то, что вы хотите

sed -e "/DB_NAME/ s/define('DB_NAME', '\(.*\)');/\1/" /path/to/file/to/search.txt
0 голосов
/ 18 сентября 2009

просто используйте case / esac construct

mystring="define('DB_NAME', 'somedb');"
case $mystring in
    *define*DB_NAME*) 
      dbname=${mystring%\'*}
      dbname=${dname##*\'}
      echo "$dbname" ;;
esac
0 голосов
/ 15 сентября 2009

как то так:

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

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