2016-08-04 154 views
1

我有很多靜態HTML文件,其中包含各種域的鏈接。Sed使用錨文本替換特定域的鏈接

我需要替換特定域的所有鏈接,只用它們的錨文本。

這是我設法想出到目前爲止命令:

sed 's|<a .*example\.com.*>\(.*\)<\/a>|\1|Ig' file.html

,這裏是它如何工作的例子:

<p>Some random text <a href="http://example.com/sample_page" title="Example Title">Anchor Text</a> | Some other random text <a href="http://example.org/">Different Anchor Text</a></p>

應成爲這樣:

<p>Some random text Anchor Text | Some other random text <a href="http://example.org/">Different Anchor Text</a></p>

上面的命令在每行只有一個鏈接的情況下效果很好,但是多於一個的時候,無論域只留下最後一個錨文本,它都會將其全部刪除。

我在這裏發現了一些其他類似的主題,但無法適應我的問題的任何解決方案。當然,我可能錯過了一個我沒有嘗試過的解決方案已經存在的話題是完全可能的。如果我沒有足夠清楚地解釋問題,或者我錯過了提供一些重要信息,請告訴我。

//編輯:

[^>]*更換.*和命令看起來像這樣經過:

sed 's|<a .*example\.com[^>]*>\(.*\)<\/a>|\1|Ig' file.html

第一關閉</a>遺骸和它被從最後一個刪除。

下面是一個例子的結果:

<p>Some random text Anchor Text</a> | Some other random text <a href="http://example.org/">Different Anchor Text</p>

更換.*[^<>]*產生同樣的結果。

+0

用'[^>] *'或'[^ <>] *'替換'。*'。 –

+0

當然。你完好無損地留下了2'。*'。 'sed's | ]*example\.com[^>]*>\([^>]*\) | \ 1 | Ig'file.html'應該可以工作。 –

+0

@WiktorStribiżew - 謝謝你,它完美的作品,你可以張貼它作爲答案,所以我可以接受它。如果沒有太多的麻煩,你能否解釋爲什麼它必須在錨文本區域被替換? –

回答

2

您應該注意.匹配任何字符,並且它也匹配任何尖括號。

您可以「脾氣」的.與否定括號表達式[^<]

sed 's|<a [^>]*example\.com[^>]*>\([^>]*\)</a>|\1|Ig' file.html 

這意味着可以爲a標籤內沒有>。由於>可能出現在您正在處理的內容中,我認爲一個更安全的替代方法是使用[^<](因爲<應始終用作實體)。

+1

@EdMorton:我知道在POSIX中一個點匹配一個換行符,我只是每天回答很多NFA的正則表達式問題,我會自動輸入我通常輸入的內容。對,[通常混淆的術語是「字符類」和「括號表達式」](http://www.regular-expressions.info/posixbrackets.html),我替換了那個。 –

+0

那麼在NFA正則表達式中,點不匹配換行符?哪些工具使用這些? –

+1

在Perl,JS,.NET,PHP(PCRE),Python,Java,Go,Swift/Objective C,Ruby(Oniguruma),R stringr或PCRE模式中,點將匹配任何字符而不帶特殊修飾符。在QRegExp(Qt4),Tcl,R TRE正則表達式模式中,默認情況下,點將匹配任何字符。 –