Пакет regex sed linux

У меня есть это регулярное выражение:

(;)(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
I have this regex - плохой способ решить любую проблему :-). редактировать ваш вопрос, чтобы показать текст, который вы хотите заменить в контексте другим текстом и ожидаемый результат. сопоставление текста, который вы хотите найти, - всегда легкая часть, а не сопоставление с другим текстом, который вы не хотите найти, - это сложно.
Ed Morton 24.07.2018 00:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
178
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы не можете использовать опережающий просмотр в шаблоне 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).

Идеально! Это работает! В других примерах разделителем команд является \ вместо |

Santiago 24.07.2018 00:46

Экранирующий символ \ был бы ужасным выбором разделителя.

Ed Morton 24.07.2018 00:50

@EdMorton: Я думаю, это опечатка, он имеет в виду /.

Casimir et Hippolyte 24.07.2018 00:53

@CasimiretHippolyte О чем ты говоришь? Никаких разделителей \ я не упомянул.

Wiktor Stribiżew 24.07.2018 00:57

@CasimiretHippolyte :) Хорошо, я не совсем понял этот комментарий, здесь 1:00 ...

Wiktor Stribiżew 24.07.2018 00:59

@CasimiretHippolyte да, я имею в виду / в других примерах вместо этого я видел этого персонажа |

Santiago 24.07.2018 16:50

Судя по тому, что вы нам сказали, это все, что вам нужно:

$ sed 's#;\(include_path = "[^"]*\)#\1:/var/www/html/#' file
include_path = ".:/usr/share/php:/var/www/html/"

Вышеупомянутое будет работать с любым sed в любой оболочке в любом окне UNIX.

Другие вопросы по теме