Обработайте группы захвата с пользовательской функцией перед использованием их в заменяемой части - PullRequest
2 голосов
/ 28 февраля 2020

У меня есть некоторые файлы уценки с неработающими относительными ссылками. Я буду sh, чтобы исправить их. Например, у меня есть этот (очень короткий) файл примера:

Please refer to [this first ressource](wrong/path/to/file) and [this other ressource](non/existing/text).
You can also search on [this website](https://example.net).

Обратите внимание, что на одной строке может быть несколько ссылок, а также есть внешние ссылки, которые должны оставаться нетронутыми.

При первом подходе, если мы забудем о внешних ссылках и если правильные ресурсы, на которые указывают относительные ссылки, будут размещены только в подпапке, мы могли бы использовать такой подход:

sed -i -E "s/(\[.*\])\(([^\)]*)\)/\1(subfolder\/\2)/g" document.md

, что превратить мой пример документа в это:

Please refer to [this first ressource](subfolder/wrong/path/to/file) and [this other ressource](subfolder/non/existing/text).
You can also search on [this website](subfolder/https://example.net).

Но у нас есть 2 проблемы:

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

Так что мне нужен способ применить функцию к моей группе захвата, прежде чем sed выполнит ее для определения строки замены. Здесь флаг захвата, который мне нужно обработать, \2.

Любое решение, даже без sed, приемлемо.

Спасибо.

1 Ответ

0 голосов
/ 29 февраля 2020

Что касается вашего второго пункта,

Правильные ресурсы, на которые ссылаются ссылки, находятся не просто в некоторых подпапках. Правильный путь может быть определен из неправильного, хотя, но мы должны go через всю папку, чтобы сделать это. Это может быть сделано довольно легко, например, в скрипте bash.

Вы не упомянули, что должен делать этот скрипт bash. В следующем я предполагаю, что вы определили функцию correct_path, которая выполняет эту работу:

correct_path () { echo ${1//@(wrong|non\/existing)/correct}; } # this example assumes shopt -s extglob

Определив эту функцию, вы можете выполнить следующую команду, которую выполняет

  • sed команда для изменения каждого address на $(correct_path address) и выдача результата в двойных кавычках для сохранения новых строк, "$(…)";
  • eval s строки, состоящей из echo, ", "$(…)", сгенерированный выше, и еще один ".
eval echo '"'"$(< os sed -E 's/(\[[^]]*\])\(([^)]*)\)/\1($(correct_path \2))/g')"'"' > os

Однако eval - зло .

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