2010-08-13 36 views
1

我使用一次性perl -pi -e命令來執行簡單搜索並從bash腳本中進行替換。我的大多數正則表達式的做工精細,直到我得到這些:在進行就地Perl編輯時使用單字符串正則表達式

perl -pi -e 's#\<\?mso-application.*\<Table.*Rows="1"\>#\<Table\>#s' 1.xml 
perl -pi -e 's#\</Table.*#\</Table\>#s' 1.xml 

請不要介意#標記,而不是斜線,我不想逃避,甚至更多的字符。這些正則表達式應該基本上刪除從excel導出的XML文件的塊,但不起作用。這似乎是因爲我使用了適用於字符串的邏輯,並試圖將其應用於文件(儘管我承認我只對perl的就地編輯有基本的瞭解)。

是否有替代方法可以在shell腳本中執行此操作(無論是在perl,awk還是sed中)?

+0

您能否顯示最小的示例文件並指出您要修復的內容以及它以何種方式不是有效的XML文件? – 2010-08-13 18:20:57

+0

最終,我通過從bash腳本中調用perl幫助程序腳本來獲得我的正則表達式,但我非常感謝您的幫助。最小的示例文件是半個兆字節,相信我,這是醜陋的。 – Gnats 2010-08-14 18:53:40

回答

4

你有perl安裝在行處理模式,但很可能是你試圖匹配跨越多行的模式。您需要擴展perl腳本以讀取整個文件,然後針對整個文件運行正則表達式。

4

我建議您放棄在命令行上使用正則表達式編輯XML文件的概念,並改用正確的XML解析器。

+0

瞭解,一般我會,但不幸的是,這種情況的情況下,它是必要的。 – Gnats 2010-08-13 16:55:47

+0

@Interwebs:怎麼這樣? – Ether 2010-08-13 17:13:20

+0

@Ether:因爲我必須輸出一個實際上並不生成有效XML的工具(我沒有任何關係,btw)並使其有效。幾乎沒有人會打擾修復這個工具。而看到它無效,我幾乎不能解析它。 – Gnats 2010-08-13 18:15:28

2

幾件事情:

  • 避免使用正則表達式來操作XML文件,因爲有這份工作更好的工具。考慮使用XML::SimpleXML::Twig模塊來實現相同的需求。
  • 看到您有多個搜索和替換操作,請用適當的Perl腳本替換單行程序,然後從您的Bash腳本中調用它。
2

在命令行中,添加-0777標誌使perl讀取整個文件(並確保您有/ s正則表達式標誌來匹配換行符)。所以:

perl -pi -0777 -e 's#\<\?mso-application.*\<Table.*Rows="1"\>#\<Table\>#s' 1.xml 
perl -pi -0777 -e 's#\</Table.*#\</Table\>#s' 1.xml 
+0

如果該模式在文件中出現多次,則還需要添加'/ g'。 – 2010-08-13 21:34:31

相關問題