2011-03-21 68 views
17

我grepping一個XML文件,這使我的輸出是這樣的:如何從Unix命令行中刪除XML標籤?

<tag>data</tag> 
<tag>more data</tag> 
... 

注意,這是一個平面文件,而不是一個XML樹。我想刪除XML標籤,並在兩者之間顯示數據。我在命令行理想的做的這一切,並想知道是否有比管道入AWK兩次更好的辦法...

cat file.xml | awk -F'>' '{print $2}' | awk -F'<' '{print $1}' 

,我想這樣做在一個命令

+0

* 「我grepping一個XML文件」 * - * 「這是一個平面文件,而不是一個XML樹」 * - 現在,文件格式良好的XML是不是? – Tomalak 2011-03-21 10:25:02

+0

也許我應該更清楚一點 - 它是一個格式良好的XML文件,但是一旦我通過grep管理它,它不再是一個XML樹結構,它本質上是一個平面文件。 – Tarski 2011-03-21 13:17:34

+0

啊,現在對我來說很有意義。無論如何,我已經提出了,因爲* clean *版本將通過XSLT而不是通過grep/sed傳遞這個XML文件。我會寫一個XSLT答案,但你似乎已經選擇了你的毒藥。 :-) – Tomalak 2011-03-21 14:09:30

回答

4

用awk:

awk '{gsub(/<[^>]*>/,"")};1' file.xml 
+0

在測試html頁面時,結果與sed(上圖)完全相同。感謝您發佈awk方法! – p1nesap 2014-01-20 23:57:46

1

試試這個:

grep -Po '<.*?>\K.*?(?=<.*?>)' inputfile 

說明:

使用Perl兼容正則表達式(-P)和輸出僅在指定的比賽(-o):

  • <.*?> - 尖括號內的任何字符非貪婪匹配
  • \K - 不包括在輸出前述匹配(重置匹配開始 - 類似於正查找的後面,但它具有可變長度匹配作品)
  • .*? - 非貪婪匹配在下一比賽停止(這部分將被輸出)
  • (?=<.*?>) - 的尖括號內的任何字符非貪婪匹配,並且不包括在輸出匹配(正look-前進 - 與變長匹配一起工作)
+0

它只能在Linux上工作,因爲在OSX上'-P'標誌已被刪除。 – kenorb 2015-05-04 21:56:55

+0

@kenorb:請注意,GNU實用程序可用於OS X.例如,使用[Homebrew](http://brew.sh/)。 – 2015-05-05 00:35:20

1

使用html2text命令行工具,它將html轉換爲純文本。

或者,你可以嘗試ex三通:

ex -s +'%s/<[^>].\{-}>//ge' +%p +q! file.txt 

或:

cat file.txt | ex -s +'%s/<[^>].\{-}>//ge' +%p +q! /dev/stdin 
0

我知道這是不是一個 「perlgolf大賽」,但我用這一招。

集合記錄分隔符<>,則僅打印奇數行:

awk -vRS='<|>' NR%2 file.xml