与えられた位置で与えられた文字列を強調表示するには?

与えられた位置で与えられた文字列を強調表示するには?

これをどのように修正できますか?

<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/'

少なくとも、サンプルファイルは正しい操作を実行します。要求されたとおりの正規表現には、および間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

答えは、入力について実際に知っている内容によって異なります。

bar32番目の項目を囲む場合は、<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

bar3aとaの間に発生するすべてを変更し、その間に何も変更したくない場合は、次のようにします。><<

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

またはGNUを使用してください。sed

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

またはGNUを使用してください。sed

sed -r 's#(.{32})(bar3)#\1<font style=BACKGROUND-COLOR:red>\2</font>#' file

もちろん、他のオプションもありますが、入力データがどれほど確実であるかによって常に異なります。

関連情報