2011-12-22 42 views
0

我必須將文件夾中的xml文件列表從UTF-16轉換爲UTF-8,刪除BOM,然後將文件中的關鍵字從UTF-16替換爲UTF-8。如何使用SED搜索和替換xml文件中的文本?

我正在使用cygwin運行bash shell腳本來完成此操作,但在今天之前我從未使用過SED,因此我需要幫助!

我發現了一個用於刪除BOM的SED單個內襯,現在我需要另一個用於在xml標題中將UTF-16替換爲UTF-8的文本。

這是我到目前爲止有:

#!/bin/bash 
mkdir -p outUTF8 

#Convert files to unix format. 
find -exec dos2unix {} \; 

#Use a for loop to convert all the xml files. 
for f in `ls -1 *.xml`; do 
    sed -i -e '1s/^\xEF\xBB\xBF//' FILE 
    iconv -f utf-16 -t utf-8 $f > outUTF8/$f 
    sed 's/UTF-16/UTF-8/g' $f > outUTF8/$f 
    echo $f 
done 

然而,這條線:

sed 's/UTF-16/UTF-8/g' $f > outUTF8/$f 

掛的腳本。任何想法,以適當的格式呢?

+0

你爲什麼不'sed'/ UTF-16/UTF-8/g'outUTF8/$ f'而不是'sed's/UTF-16/UTF-8/g'$ f > outUTF8/$ f' – 2011-12-22 23:27:33

+2

這不是唯一的問題,而是改變''ls -1 * .xml'中的f'; ''爲f中的* .xlm'和'$ f'爲'「$ f」' – 2011-12-22 23:29:09

+0

是的,我同意這將阻止它拆分其中有空格的文件。另外,'sed -i -e'1s/^ \ xEF \ xBB \ xBF //'FILE'我真的不知道'FILE'是什麼,它的目的是什麼? – 2011-12-22 23:53:39

回答

2

嘗試這樣的事情 -

for filename in *.xml; do 
    sed -i".bak" -e '1s/^\xEF\xBB\xBF//' "$filename" 
    iconv -f utf-16 -t utf-8 "$filename" > outUTF8/"$filename" 
    sed -i 's/UTF-16/UTF-8/g' outUTF8/"$filename" 
done 

第一sed會讓你的原始文件的備份與擴展.bak。然後它將使用iconv轉換文件並將其保存在具有相同文件名的新創建的目錄下。最後,您將使用sed進行文件更改以刪除文本。

+0

好吧,一切都快成效了。我在文件頭中仍然有<?xml version =「1.0」encoding =「utf-16」?>。我需要它是<?xml version =「1。0「encoding =」utf-8「?>,因爲這是文件被轉換成的格式。腳本不再掛起,它仍然運行到最後。 – 2011-12-27 16:22:13

+0

在最後的'sed'行嘗試使用小寫字母,即使用這個'sed -i's/utf-16/utf-8/g'outUTF8 /「$ filename」' – 2011-12-27 16:25:03

+0

我拿出所有的大寫字母並且做成了:sed -i's/UTF-16/UTF-8/g'out /「$ filename」,但它仍然沒有替換文本,我檢查了文件屬性並且沒有權限問題 – 2011-12-27 16:58:54

1

2東西

  1. 你有多大的$ F文件,如果它真的非常大,它可能只是需要長時間才能完成。

  2. Opps,我看到你的循環底部有一個echo $f。在sed命令之前移動它,以便查看文件名中是否有空格。

2a :-)。或者只是將所有對$f的引用更改爲"$f"以防止出現空格。

我希望這會有所幫助。

+0

如果文件名中有空格,則for循環在此形狀中也會失敗。 – 2011-12-22 23:28:01

+0

最大的是88kb。 – 2011-12-22 23:42:11

+0

好吧,大小看起來不像是問題。你的文件名有空格嗎? @JaypalSingh看起來有我們所有的當前問題。這是否解決您的問題,或者您的代碼仍然掛起?祝你好運。 – shellter 2011-12-23 01:30:26