也许可以通过(扩展的)正则表达式来实现,但我真的不知道是否可以或如何实现。似乎有一种方法可以通过使用来访问“找到的东西”,$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 或其他)。
您的问题有点复杂,因为:
当搜索模式跨越多行时,大多数语言中的正则表达式会变得更加复杂。
由于您没有提供实际代码示例,因此我很难找到一个独特的模式来锚定我的正则表达式。在下面的脚本中,我正在使用
<moreCodeThatAlwaysStaysTheSame>
,.someCodeAndOth
您需要对其进行更改,以反映要替换的文本两侧的实际独特模式。
尽管如此,这里有一个 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