Регулярное выражение заменить на sed - PullRequest
0 голосов
/ 23 декабря 2011

Я делаю замены в PHP-файле, и мне нужно изменить языковую переменную с помощью sed. Вот мой РАБОЧИЙ код:

sed -i '' -e "s/\$config\['language'\]  = \"english\";/\$config['language'] = '$LANGUAGE';/" Sources/$APP/application/config/config.php

Это не работает, чтобы соответствовать любой языковой набор:

sed -i '' -e "s/\$config\['language'\]  = \"*\";/\$config['language'] = '$LANGUAGE';/" Sources/$APP/application/config/config.php

Что не так?

Ответы [ 3 ]

1 голос
/ 23 декабря 2011

Это потому, что * не делает то, что вы думаете, что делает. В регулярном выражении sed, как и во всех регулярных выражениях, используйте .*? для обозначения любого набора символов (кроме символов новой строки). Это потому, что . означает совпадение с чем-либо один раз, а * означает совпадение с предыдущим элементом любое количество раз. ? делает его не жадным, что означает, что он будет соответствовать как можно меньшему количеству символов, если совпадает остальная часть выражения. Я не знаю, что вы вводите, поэтому я не могу сказать, нужен ли вам знак вопроса, лучше, чем потом сожалеть.

1 голос
/ 23 декабря 2011

Вам необходимо заменить * в выражении на .*.* означает «0 или более экземпляров предыдущего элемента» (в данном случае "), поэтому вы хотите сначала сопоставить . (любой символ), а затем указать 0 или более экземпляров .что .

1 голос
/ 23 декабря 2011

В sed символ звездочки (*) обозначает «повторить предыдущую вещь 0 или более раз».Это в отличие от оболочки, где она распространяется на что угодно.То, что вы хотите сделать, это нажать . (что означает «что-нибудь»), прямо перед звездочкой, например:

sed -i '' -e "s/\$config\['language'\]  = \".*\";/\$config['language'] = '$LANGUAGE';/" Sources/$APP/application/config/config.php

Это скажет вашей программе «повторить любой символ (.»).) любое количество раз (*) ".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...