如何在给定位置突出显示给定字符串?

如何在给定位置突出显示给定字符串?

我们如何修改这个:

<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

当然,还有其他选项,但它们始终取决于您对输入数据的确定程度。

相关内容