У меня есть это регулярное выражение:
(;)(include_path\s\=\s\")(((?!\").)*)(\")
и я хочу заменить этот текст:
;include_path = ".:/usr/share/php"
к:
include_path = ".:/usr/share/php:/var/www/html/"
замена регулярного выражения:
\2\3:/var/www/html/\5
Я использую sed в ubuntu 18.04, это моя команда:
sed -E 's/(;)(include_path \= \")(((?!\").)*)(\")/\2\3:/var/www/html/\5/g' FILENAME
Но это дает мне ошибку. Я использовал стиль sed вот так:
sed -E 's/REGEX/REPLACE/g' FILENAME





Вы не можете использовать опережающий просмотр в шаблоне sed. Однако ваш умеренный жадный токен (?:(?!\").)* можно просто преобразовать в выражение с отрицательными скобками, поддерживаемое sed, [^"]*.
Кроме того, вам понадобятся другие разделители регулярных выражений, поскольку в шаблоне замены используются /, например |.
Использовать
sed -E 's|;(include_path = ")([^"]*)(")|\1\2:/var/www/html/\3|g' FILENAME
См. онлайн-демонстрация:
s=';include_path = ".:/usr/share/php"'
echo $s | sed -E 's|;(include_path = ")([^"]*)(")|\1\2:/var/www/html/\3|g'
# => include_path = ".:/usr/share/php:/var/www/html/"
Подробности
; - точка с запятой (не нужно записывать, если нужно отбросить)(include_path = ") - буквальный текст, захваченный в Группу 1 (\1)([^"]*) - любые символы 0+, кроме ", захваченные в Группу 2 (\2)(") - ", захваченный в Группу 3 (\3).Идеально! Это работает! В других примерах разделителем команд является \ вместо |
Экранирующий символ \ был бы ужасным выбором разделителя.
@EdMorton: Я думаю, это опечатка, он имеет в виду /.
@CasimiretHippolyte О чем ты говоришь? Никаких разделителей \ я не упомянул.
@CasimiretHippolyte :) Хорошо, я не совсем понял этот комментарий, здесь 1:00 ...
@CasimiretHippolyte да, я имею в виду / в других примерах вместо этого я видел этого персонажа |
Судя по тому, что вы нам сказали, это все, что вам нужно:
$ sed 's#;\(include_path = "[^"]*\)#\1:/var/www/html/#' file
include_path = ".:/usr/share/php:/var/www/html/"
Вышеупомянутое будет работать с любым sed в любой оболочке в любом окне UNIX.
I have this regex- плохой способ решить любую проблему :-). редактировать ваш вопрос, чтобы показать текст, который вы хотите заменить в контексте другим текстом и ожидаемый результат. сопоставление текста, который вы хотите найти, - всегда легкая часть, а не сопоставление с другим текстом, который вы не хотите найти, - это сложно.