sed regex - сопоставление текста между двумя двойными кавычками, когда в строке появляется шаблон - PullRequest
4 голосов
/ 06 марта 2011

Используя пакетный PHP из оболочки Linux, я пытаюсь заменить номер лицензии в конфигурационном файле ниже другим. Рассматриваемая строка конфигурации может не всегда выглядеть одинаково, но может содержать или не содержать пробелы, табуляции и т. Д.

Примеры:

$config['license_number'] = "jfur2e2ev9uhuvcfu";
$config['license_number'] ="jfur2e2ev9uhuvcfu";
$config['license_number']    ="";
$config['license_number']= "jfur2e2ev9uhuvcfu";
$config[ 'license_number' ] = "jfur2e2ev9uhuvcfu";

Ключ заключается в том, чтобы найти любую строку с "номер_содержания" (или любым другим указанным текстом) и заменить все, что находится в двойных кавычках, на новый параметр конфигурации.

Я хотел бы использовать sed, чтобы я мог рекурсивно просматривать все файлы. Я пробовал использовать позитивный взгляд, но не могу определить текст фиксированной длины для поиска.

Ответы [ 2 ]

2 голосов
/ 06 марта 2011

Предполагается, что в строке имеется только одно вхождение:

sed '/license_number/s/"\([^"]*\)"/"foo"/' inputfile

В Perl вы можете использовать \K для положительных взглядов переменной длины.

0 голосов
/ 06 марта 2011

Иногда решение может быть решено без особых регулярных выражений. Попробуйте awk

$ awk 'BEGIN{OFS=FS="="}/license_number/{$2="\"foo\""}1'  file
$config['license_number'] ="foo"
$config['license_number'] ="foo"
$config['license_number']    ="foo"
$config['license_number']="foo"
$config[ 'license_number' ] ="foo"

это говорит, что когда "номер_лицензии" найден, измените на 2-е поле значение "foo". Разделитель входного поля и разделитель выходного поля установлены на «=».

...