これをどのように修正できますか?
<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
答えは、入力について実際に知っている内容によって異なります。
bar3
2番目の項目を囲む場合は、<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
bar3
aと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
もちろん、他のオプションもありますが、入力データがどれほど確実であるかによって常に異なります。