То, что вы ищете, называется "захват образца", где определенный шаблон, соответствующий регулярному выражению, сохраняется в переменной. Детали того, как это делается, зависят от используемого языка (Perl, awk, sed и т.д.).
Ваша проблема немного сложнее, потому что:
Вы не должны анализировать HTML с регулярными выражениями
Регулярные выражения становятся более сложными в большинстве языков, когда ваш шаблон поиска занимает несколько строк.
Поскольку вы не включили образец своего реального кода, мне сложнее найти уникальный шаблон для привязки моего регулярного выражения. В приведенном ниже сценарии я использую <moreCodeThatAlwaysStaysTheSame>
и .someCodeAndOth
вам нужно будет изменить это, чтобы отразить фактические уникальные шаблоны, которые обводят текст, который вы хотите заменить.
Вы не должны анализировать HTML с регулярными выражениями
Все, что было сказано, это Perl-скрипт, который заменит шаблоны, которые вы задали в своем вопросе:
#!/usr/bin/perl
###############################################
# This sets the line separator to a string #
# instead of a new line (\n). Use something #
# that uniquely delimits the code you want to #
# replace. #
###############################################
local $/="<moreCodeThatAlwaysStaysTheSame>";
#######################################################
# Read the input file, line by line. Remember that #
# because of the previous command, a line is expected #
# to end with "<moreCodeThatAlwaysStaysTheSame>" #
#######################################################
while (<>) {
#####################################################
# $str is what we want to replace the pattern with. #
# "XXX" will be replaced by the correct mp3. #
#####################################################
my $str=<<Eof;
<audio controls="controls">
<source src="XXXX" type="audio/mpeg">
<embed height="50" width="100" src="XXXX">
</audio>
Eof
###########################################################
# Match the entire string we will replace AND the #
# mp3 we are looking for. In Perl (and other languages) #
# placing a regex pattern in (parentheses) captures it. #
# We can now refer to the 1st captured pattern as $1, the #
# second as $2 etc. #
###########################################################
/(.someCodeAndOth.+?src=.+\/(.+?\.mp3).+?$)/s;
###################################################
# Save the matches into variables, otherwise they #
# will be lost at the next match operation. #
###################################################
my ($match,$rep,$mp3)=($1,$1,$2);
###################################################
# Replace "XXXX" with the appropriate mp3 in $str #
###################################################
$str=~s/XXXX/$mp3/g;
#########################################
# Replace the matched pattern with $str #
#########################################
s/$match/$str/;
#################
# Print it out! #
#################
print;
}
Сохраните этот скрипт как foo.pl
и запустите его в вашем файле следующим образом:
perl foo.pl input_file.html > output_file.html