Как захватить группу в sed, которая использует переменные bash - PullRequest
0 голосов
/ 13 мая 2019

Я использую sed с переменными в скрипте bash для разбора изображений уценки ![Legend](path/image.png), и я пытаюсь захватить группу символов одновременно.

Синтаксис для "нормального" регулярного выражения был бы таким: 1) легенда изображения, 2. путь к изображению: !\[(.*)\]\((.*)\)

Например, из ![[Muybridge, Eadward](https://www.britannica.com/biography/Eadweard-Muybridge/images-videos)(1887)](https://i.imgur.com/p2pwfme.jpg) даст:

  1. легенда: [Muybridge, Eadward](https://www.britannica.com/biography/Eadweard-Muybridge/images-videos)(1887)
  2. путь: https://i.imgur.com/p2pwfme.jpg

Но нормальное регулярное выражение комплексируется внутри sed с использованием переменной.

Вот фрагмент сценария, который анализирует изображения в документе уценки (мой вопрос касается последней команды sed):

for filename in "$3"*; do
  COUNTER=$[$COUNTER +1]
  echo "<b>${filename%.*}</b> will be renamed <b>${GET[id]}-img${COUNTER}.*</b><br>"
  sed -i -e "s@${filename%.*}@${GET[id]}\-img${COUNTER}@g" ../${GET[id]}.md
  mv ${filename%.*}.${filename##*.} ${GET[id]}-img${COUNTER}.${filename##*.}
  sed -i -e "s@!['('.*')'](.*${GET[id]}\-img${COUNTER}@![\1](media\/${GET[id]}\-img${COUNTER}@g" ../${GET[id]}.md
done

Вы увидите, что:

  1. Я использую двойные кавычки, так как sed вызывает переменные
  2. Я использую @ разделитель вместо /
  3. Мне не нужно экранировать [ ] в этом контексте (это подтверждается)
  4. Я пытался избежать скобок, захватывающих группу с помощью '('.*')', но это не работает, также пытался с \(.*\)

Поэтому мне интересно, как захватить группу (как правильно использовать () согласно синтаксису регулярных выражений) в таком контексте: bash + sed + variable.

1 Ответ

0 голосов
/ 14 мая 2019

Вы увидите, что:

  1. Я использую двойные кавычки, так как sed вызывает переменные
  2. Я использую @ разделитель вместо /
  3. Мне не нужно избегать [ ] в этом контексте (это подтверждается)
  4. Я пытался избежать скобок, захватывающих группу с помощью '('.*')', но это не работает, также пытался с \(.*\)

Поэтому мне интересно, как захватить группу (как правильно использовать () в соответствии с синтаксисом регулярных выражений) в таком контексте: bash + sed + variable.

Чтобы адаптировать ваше регулярное выражение (я имею в виду то, которое вы называете "нормальным" регулярным выражением) к sed в двойных кавычках, попробуйте следующее:

sed "s@!\[\(.*\)]\((.*)\)@Captures: 1: \1 2: \2@"

Тогда, если вы введете данные, которые вы нам дали, вы должны увидеть:

Captures: 1: [Muybridge, Eadward](https://www.britannica.com/biography/Eadweard-Muybridge/images-videos)(1887) 2: (https://i.imgur.com/p2pwfme.jpg)

Итак, это показывает вам, как вообще избежать выражения.

Примечания:

  • Неправильно, что вам не нужно экранировать [ ] в этом контексте. Вам нужно убежать от первого, но не от второго.

  • В вашем примере кода вы ссылаетесь на переменные, которые не определены, и на шаблоны, которые не соответствуют вашим образцам входных данных, поэтому я не могу помочь с этим битом.

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