1

Может быть, этого можно достичь с помощью (расширенных) регулярных выражений, но я действительно не знаю, если или как. Кажется, есть способ получить доступ к "найденным вещам", используя $1, $2, … но я понятия не имею, где это использовать.

Я хочу найти и заменить (в нескольких документах) выражение "с дырами в нем".

Пример:

<someCodeAndOtherStuffThatAlwaysStaysTheSame
value="somePathThatAlwaysStaysTheSame/horse.mp3">
<moreCodeThatAlwaysStaysTheSame
src="samePathThatAlwaysStaysTheSame/horse.mp3"
<moreCodeThatAlwaysStaysTheSame>

должен превратиться в

<audio controls="controls">
  <source src="horse.mp3" type="audio/mpeg">
</audio>

или возможно

<audio controls="controls">
  <source src="horse.mp3" type="audio/mpeg">
<embed height="50" width="100" src="horse.mp3">
</audio>

Конечно, horse.mp3 является переменной и той частью, которую я назвал "дырой".

В основном я использую Bluefish Editor и gedit но решение с использованием terminal будет таким же хорошим.

1 ответ1

0

То, что вы ищете, называется "захват образца", где определенный шаблон, соответствующий регулярному выражению, сохраняется в переменной. Детали того, как это делается, зависят от используемого языка (Perl, awk, sed и т.д.).

Ваша проблема немного сложнее, потому что:

  1. Вы не должны анализировать HTML с регулярными выражениями

  2. Регулярные выражения становятся более сложными в большинстве языков, когда ваш шаблон поиска занимает несколько строк.

  3. Поскольку вы не включили образец своего реального кода, мне сложнее найти уникальный шаблон для привязки моего регулярного выражения. В приведенном ниже сценарии я использую <moreCodeThatAlwaysStaysTheSame> и .someCodeAndOth вам нужно будет изменить это, чтобы отразить фактические уникальные шаблоны, которые обводят текст, который вы хотите заменить.

  4. Вы не должны анализировать 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .