Sed

sed 每行替換多個匹配項

  • April 29, 2021

我正在嘗試替換一些 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 到第二個結尾的所有內容。如果您想避免僅以 開頭的連結#,請刪除+.

引用自:https://unix.stackexchange.com/questions/647295