일부 HTML 링크를 교체하여 새 탭에서 열리도록 하려고 합니다(동일한 페이지에 대한 링크 제외).
내 문제를 설명하는 더미 HTML 페이지는 다음과 같습니다. 나는 그것을 부른다테스트.html.
<p>
This is the <a href="https://www.google.com/">Google link</a>
</p>
<p>
And these are <a href="https://twitter.com/">Twitter link</a> and <a href="https://www.instagram.com/">Instagram link</a>.
</p>
이 코드를 사용하여 링크를 찾고 이를 추가 콘텐츠로 대체합니다.
sed -E 's/(<a href="[^#]+[-a-zA-Z0-9@:%._\+~#=/?&]+")(>)/\1 target="_blank">/g' test.html
결과는 다음과 같습니다.
<p>
This is the <a href="https://www.google.com/" target="_blank">Google link</a>
</p>
<p>
And these are <a href="https://twitter.com/">Twitter link</a> and <a href="https://www.instagram.com/" target="_blank">Instagram link</a>.
</p>
추가 항목에 유의하세요 target="_blank"
. 일치하는 항목이 여러 개 없으면 예상대로 작동합니다. 한 줄에 일치하는 항목이 여러 개인 경우 가장 오른쪽 항목만 교체됩니다. 전체 라인을 블록으로 감지하는 것 같습니다.
이에 대해 조사한 후 탐지 블록을 분할하기 위해 부정을 추가하라는 제안을 발견했습니다. 그래서 태그를 닫기 위해 부정을 추가했습니다 >
. 따라서 ^>
코드는 다음과 같습니다.
sed -E 's/(<a href="[^#]+[-a-zA-Z0-9@:%._\+~#=/?&^>]+")(>)/\1 target="_blank">/g' test.html
그러나 이것은 별 효과가 없는 것 같습니다. 어쩌면 내가 뭔가 잘못했을 수도 있습니다.
실행/테스트sed 4.7. 실행되도록 설계됨sed 4.4.
답변1
이 표현식은 [^#]+
첫 번째 href부터 두 번째 href 끝까지의 모든 항목과 일치합니다. 으로 만 시작하는 링크를 피하고 싶은 경우 #
.+