Sed
sed 每行替換多個匹配項
我正在嘗試替換一些 html 連結,以便它們在新選項卡中打開(指向同一頁面的連結除外)。
這是一個虛擬的 html 頁面來說明我的問題。我稱之為test.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上執行。
該表達式
[^#]+
匹配從第一個 href 到第二個結尾的所有內容。如果您想避免僅以 開頭的連結#
,請刪除+
.