Подходим и заменяем! [Foo] (/ bar /) на Regex в SED - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь написать RegEx для SED, чтобы он соответствовал, и заменить следующий текст MarkDown:

![something](/uploads/somethingelse)

на:

![something](uploads/somethingelse)

Теперь в PCRE соответствующий шаблон будет:

([\!]|^)(\[.*\])(\(\/bar[\/])

, как проверено на Regex101:

enter image description here

, но на SED это недопустимо,

Я пытался много комбинаций, прежде чем спрашивать, но я схожу с ума, потому что я не эксперт по RegEx.

Что такоеправильное регулярное выражение SED, чтобы сопоставить и разбить эту строку , чтобы сделать замену на sed, как описано здесь ?

1 Ответ

0 голосов
/ 05 октября 2018

Необходимая команда sed должна запускаться с параметром -E, поскольку ваше регулярное выражение соответствует POSIX ERE.То есть круглые скобки должны быть неэкранированы, а буквальные скобки должны быть экранированы (как в PCRE).

Вы можете использовать

sed -E 's;(!\[.*])(\(/uploads/);\1(uploads/;g'

Подробности

  • (!\[.*]) - Группа захвата 1:
    • ! - символ ! (если вы используете "...", вам нужно его избежать)
    • \[.*] - [, затем любые 0+ символов, а затем ]
  • (\(/uploads/) - Группа захвата 2:
    • \( - a ( char
    • /uploads/ - подстрока /uploads/.

Шаблон, совместимый с POSIX BRE (фактическое «быстрое исправление» вашего текущего шаблона)) будет выглядеть как

sed 's;\(!\|^\)\(\[.*](\)/\(uploads/\);\1\2\3;g'

Обратите внимание, что \(...\) определяет группы захвата, ( соответствует литералу (, а \| определяет оператор чередования.

Подробности

  • \(!\|^\) - Группа захвата 1: ! или начало строки
  • \(\[.*](\) - Группа захвата 2: a [, затем 0+ символы, а затем (
  • / - / char
  • \(uploads/\) - Группа захвата 3: uploads/ подстрока

См. online sed demo

Разделитель регулярных выражений ; помогает исключить экранирование \ символовдо / и сделать шаблон более читабельным.

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