我们如何修改这个:
<a href="http://foo.bar1">asfdlksafbar1qsasadf</a><br>
<a href="http://foo.bar2">svasfbar2saldkfj</a><br>
<a href="http://foo.bar3">safdfrhbar3saljfd</a><br>
<a href="http://foo.bar4">erasfasfbar4asfer</a><br>
对此?
<a href="http://foo.bar1">asfdlksafbar1qsasadf</a><br>
<a href="http://foo.bar2">svasfbar2saldkfj</a><br>
<a href="http://foo.bar3">safdfrh<font style=BACKGROUND-COLOR:red>bar3</font>saljfd</a><br>
<a href="http://foo.bar4">erasfasfbar4asfer</a><br>
因此,bar3
只有当出现在以下内容之间时,才会突出显示:
">xxx</a>
我正在使用 ksh/OpenBSD。
答案1
以下内容应该适用于任何使用 Perl 的系统:
perl -pe 's/(>.*)(bar3)(.*<\/a>)/$1<font style=BACKGROUND-COLOR:red>$2<\/font>$3/'
至少它在您的示例文件上做了正确的事情;正如您所要求的,中 的 regexp要求在和之间s/regexp/replacement/
进行匹配,但是如果您实际的 HTML 输入比这更复杂,那么它可能会过于简单化。如果是这样,请提供有关您的要求的更多详细信息。bar3
>
</a>
答案2
尝试
awk -v pattern="bar3" 'match($0, pattern){
beg = index( $0, ">")
content = gensub(/<.*$/, "", "", gensub(/^[^>]+>/, "", "", $0))
beg_str = index( content, pattern)
if (match (content, pattern)) {
print substr($0, 0, beg) substr(content, 0, beg_str - 1) "<fontstyle=BACKGROUND-COLOR:red>" substr(content, beg_str, length(pattern)) "</font>" substr(content, beg_str + length(pattern)) "</a><br>"
next
}
}
{print}' file.html
希望它能在 ksh 上运行
答案3
该解决方案需要 GNU 版本的 awk...
awk '{ print gensub(/(>.*)(bar3)(.*<\/a>)/,"\\1<font style=BACKGROUND-COLOR:red>\\2</font>\\3","g") }' yourfile.html
答案4
任何答案都取决于您对输入的实际了解。
如果你知道你想要第二个bar3
被 包围<font>
,你可以这样做:
perl -pe 's#(.*bar3.*)(bar3)#$1<font style=BACKGROUND-COLOR:red>$2</font>#' file
或者
sed 's#\(.*bar3.*\)\(bar3\)#\1<font style=BACKGROUND-COLOR:red>\2</font>#' file
或者,使用 GNU sed
:
sed -r 's#(.*bar3.*)(bar3)#\1<font style=BACKGROUND-COLOR:red>\2</font>#' file
如果您想更改a和 abar3
之间出现的所有情况(中间没有),您可以这样做:>
<
<
perl -pe 's#(>[^<]*)(bar3)([^<]*<)#$1<font style=BACKGROUND-COLOR:red>$2</font>$3#' file
或者
sed 's#\(>[^<]*\)\(bar3\)\([^<]*<\)#\1<font style=BACKGROUND-COLOR:red>\2</font>\3#' file
或者,使用 GNUsed
sed -r 's#(>[^<]*)(bar3)([^<]*<)#\1<font style=BACKGROUND-COLOR:red>\2</font>\3#' file
如果您想替换bar3
从一行的第 33 个位置开始的任何内容,您可以执行以下操作:
perl -pe 's#(.{32})(bar3)#$1<font style=BACKGROUND-COLOR:red>$2</font>#' file
或者
sed 's#\(.\{32\}\)\(bar3\)#\1<font style=BACKGROUND-COLOR:red>\2</font>#' file
或者,使用 GNUsed
sed -r 's#(.{32})(bar3)#\1<font style=BACKGROUND-COLOR:red>\2</font>#' file
当然,还有其他选项,但它们始终取决于您对输入数据的确定程度。