自动替换表达式

自动替换表达式

也许可以通过(扩展的)正则表达式来实现,但我真的不知道是否可以或如何实现。似乎有一种方法可以通过使用来访问“找到的东西”,$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

您正在寻找的是“模式捕获”,其中与正则表达式匹配的特定模式保存在变量中。具体如何执行取决于所使用的语言(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

相关内容