주어진 위치에서 주어진 문자열을 강조 표시하는 방법은 무엇입니까?

주어진 위치에서 주어진 문자열을 강조 표시하는 방법은 무엇입니까?

이것을 어떻게 수정할 수 있습니까?

<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두 번째 항목을 둘러싸기를 원하는 경우 <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

물론 다른 옵션도 있지만 입력 데이터가 얼마나 확실한지에 따라 항상 달라집니다.

관련 정보