2016-12-09 117 views
0

我的問題:如何找到帶有不匹配的左尖括號的行,並用它們的HTML替換替換這些括號。在HTML中替換不匹配的左尖括號內容

例輸入:

<dd> 
    Pro 10g Flüssigkeit: 2g Wasserstoffperoxid <10% Tenside. ENTHÄLT: Sulfamidsäure,</dd> 

預計通過替代無與倫比 '< 10%' 的字符串輸出:

<dd> 
    Pro 10g Flüssigkeit: 2g Wasserstoffperoxid &lt;10% Tenside. ENTHÄLT: Sulfamidsäure,</dd> 

有德國的 'Umlaute' 包含在我的示例文本只是他們可能的情況下'亂了東西'...

我想如果可能的話使用sed或awk。

我已閱讀: Use sed with regex and (How to decrement (substract) number in file with sedsed - regex square brackets detection in Linux和其他Q & A,但我似乎無法讓我的頭左右的正則表達式。抱歉!

非常感謝您的幫助!

回答

1

這可能是不夠好:

$ sed -E 's/<([^>]+<)/\&lt;\1/g' file 
<dd> 
    Pro 10g Flüssigkeit: 2g Wasserstoffperoxid &lt;10% Tenside. ENTHÄLT: Sulfamidsäure,</dd> 

如果沒有,那麼編輯您的問題提供真正代表你的真實輸入一個更完整的(但仍然簡潔和可測試)的例子。

沒有什麼特別的umlaute或任何其他輸入字符順便說一句。

+1

感謝您的許多簡明後發現一切答案很明確!讀他們的快樂:-) –

+0

關於umlaute:當一個姓氏中完全正常的'ü'終止了我的awk腳本時,我解析了vCards(即純ASCII文件)。 我從來沒有發現爲什麼成千上萬個這樣的vCard(包含Umlaute和'ß'以及所有來自同一個源碼的文件)被解析出來沒有任何問題,但是這個不起作用。因此...... –

+0

如果有任何字符終止(或有任何其他不利影響)你的awk腳本,那麼你在awk腳本中就會有一個簡單而且簡單的錯誤。這根本不會發生。 –

2

這是一個危險的提議,因爲sed作品上線,由線的基礎上,和每行,有幾種情況要考慮:

有可能是僅低於字符沒有任何HTML標籤:

<p> 
    x < 10 
</p> 

有可能是,在你的榜樣,一個html標記後低於字符

<p> x < 10 </p> 

小於號字符可能是內部的html標記。

<img src="..." alt="Graph for x < 10"> 

它可能是一個很長的html標籤,它將在後面的一行中關閉。

<img 
    src="..." 
    alt="..." 
> 

我會做的是首先假定只有前兩個選項都存在,那麼使用這樣的事情:

sed -i.orig -r 's/<([^>]*($|<))/\&lt;\1/g' file. 

這將保持原始文件的備份與新擴展名爲.orig,這樣你就可以運行一個diff程序來查看發生了什麼變化。

至於如何工作的:

  • s/AAA/BBB/g取代的AAABBB
  • s/A(CC)/B\1/g任何發生替換ACCBCC,那就是在括號中的部分將插入\1
  • [^>]*手段零個或多個任意字符以外的其他>
  • ($|<)可以是行尾或<,以先到者爲準。

所以它搜索一個<沒有>,直到下一次<或線的末端,並替換部分與&lt;,它最初的<

+0

感謝您的快速回答和您非常詳細的解釋!高度讚賞:-) –