Думаю, я бы использовал Perl.Это можно сделать в виде одной строки, таким образом:
perl -pe 's{\[\[([^/.|]+)(|[^]]+)?\]\]}{$x=$1;$y=$2;$x=~s%_%/%g;"[[$x$y]]"}gex;' <<'EOF'
this is a line with a [[Link_to_something]] and [[Something_else|something else]]
this site is cool [[http://example.com/this_page]]
EOF
Вывод этого:
this is a line with a [[Link/to/something]] and [[Something/else|something else]]
this site is cool [[http://example.com/this_page]]
Вопрос о том, хороший ли это стиль и т. Д., Полностью открыт для обсуждения.
Я объясню эту версию кода, которая изоморфна приведенному выше коду:
perl -e 'use strict; use warnings;
while (my $line = <>)
{
$line =~ s{ \[\[ ([^/.|]+) (|[^]]+)? \]\] }
{ my($x, $y) = ($1, $2); $x =~ s%_%/%g; "[[$x$y]]" }gex;
print $line;
} '
Цикл while
в основном то, что -p
предоставляет в первой версии.Я явно назвал входную переменную $line
вместо использования неявного $_
, как в первой версии.Мне также пришлось объявить $x
и $y
из-за use strict; use warnings;
.
Команда замены принимает форму s{pattern}{replace}
, поскольку в самих регулярных выражениях есть косые черты.Модификатор x
допускает (несущественные) пробелы в двух частях, что облегчает разметку.Модификатор g
повторяет подстановку так часто, как соответствует шаблону.Модификатор e
говорит: «обрабатывать правую часть подстановки как выражение».
Соответствующий шаблон ищет пару открытых квадратных скобок, а затем запоминает последовательность символов, отличную от /
, .
или |
, за которыми необязательно следует |
и последовательность символов, отличных от ]
, заканчивающаяся парой квадратных скобок.Два захвата: $1
и $2
.
Выражение замены сохраняет значения $1
и $2
в переменных $x
и $y
.Затем он применяет более простую замену к $x
, превращая подчеркивания в косые черты.Тогда значением результата является строка [[$x$y]]
.Вы не можете изменить $1
или $2
непосредственно в выражении замены.И внутренние s%_%/%g;
клобберы $1
и $2
, поэтому мне понадобились $x
и $y
.
Может быть другой способ сделать это - это Perl, так что TMTOWTDI:есть больше чем один способ сделать это.Но это по крайней мере работает.