2009-12-10 53 views
2

我在一個web根目錄下有一組文件,它們都包含我想刪除的特殊字符(Â,€,â等)。Unix查找替換多個文件中的特殊字符

我的命令

find . -type f -name '*.*' -exec grep -il "Â" {} \; 

發現&列出了文件就好了,但我的命令

find . -type f -name '*.*' -exec tr -d 'Â' '' \; 

不會產生我在尋找的結果。

有什麼想法?

+0

我也許應該澄清。我正在尋找的結果是從特殊字符當前所在的所有文件中刪除特殊字符。 – Schoffelman 2009-12-10 18:11:49

+0

這就是你在原始問題的第一句話中所說的內容。我的問題是你的'tr'命令與你期望的有什麼不同? – 2009-12-10 18:15:11

+0

是的,在我運行tr -d命令並重新運行第一個find命令後,它仍然會返回相同的結果,而我想刪除每個結果。 – Schoffelman 2009-12-10 21:08:35

回答

4

全部更換非ASCII字符在當前目錄下的所有文件,你可以使用:

find . -type f | xargs perl -pi.bak -e 's,[^[:ascii:]],,g' 

事後你必須找到並刪除所有「.bak的」文件:

find . -type f -a -name \*.bak | xargs rm 
2

使用

tr -d 'Â' 

什麼是'代表什麼嗎?在我的系統上使用你的命令產生這個錯誤:

tr: extra operand `'

Only one string may be given when deleting without squeezing repeats.

Try `tr --help' for more information.

+0

''只是把字符放在引號中,用什麼都沒有替換掉 – Schoffelman 2009-12-10 16:42:47

+0

tr -d''只是刪除,我認爲沒關係,你需要什麼,或者我錯過了什麼? – 2009-12-10 16:52:53

+0

nope,刪除就好了 – Schoffelman 2009-12-10 16:54:20

3

我會建議看看sed。它可以用來替換文件的內容。

所以,你可以使用命令:

find . -type f -name '*.*' -exec sed -i "s/Â//" {} \; 

我有一個簡單的例子測試這一點,它似乎工作。 -exec應該處理名稱中帶有空格的文件,但可能還有其他我不知道的漏洞。

+0

我能夠得到這個與一些額外的標誌 找到工作。 -type'f -name'*。*'-exec sed -i「s/// gi」{} \; – Schoffelman 2009-12-17 17:09:50

1
sed 's/ø//' file.txt 

這應該做的伎倆用一個空字符串替換一個特殊的字符。

find . -name "*.*" -exec sed 's/ø//' {} \ 
+0

無用的貓 - sed's /ø//'file.txt – ghostdog74 2009-12-10 23:21:54

+0

謝謝,現在修復。 – 2009-12-10 23:39:34

0

我會使用類似這樣的東西。

for file in `find . -type f` 
do 
    # Search for char end remove it. Save file as file.new 
    sed -e 's/[ۉ]//g' $file > $file.new 
    # mv file.new to file DON'T RUN IF YOU WILL NOT OVERITE ORIGINAL FILE 
    mv $file.new $file 
done 

上面的腳本將失敗,因爲levislevis85已經提到它與文件名中的空格。如果您使用以下代碼,則情況不會如此。

find . -type f | while read file 
do 
    # Search for char end remove it. Save file as file.new 
    sed -e 's/[ۉ]//g' "$file" > "$file".new 
    # mv file.new to file DON'T RUN IF YOU WILL NOT OVERITE ORIGINAL FILE 
    mv "$file".new "$file" 
done 
+0

有空格的文件中斷。 – ghostdog74 2009-12-10 23:21:18

+0

好的,沒想到有人在Linux環境中使用文件名中的空格。但你是對的,這是一個點。我會在我的帖子中添加更正。 – user224243 2009-12-11 22:31:30

0

這將有助於瞭解「不會產生我正在尋找的結果」的含義。但是,您的命令tr未提供要處理的文件名。您可以將其更改爲:

find . -type f -name '*.*' -exec tr -d 'Â' {} \; 

哪一個將輸出所有內容到標準輸出。您可能想要修改文件。您可以使用Grundlefleck的答案,但在答案中提到的問題之一是如果有大量文件。你可以這樣做:

find . -type f -name '*.*' -print0 | xargs -0 -I{} sed -i "s/Â//" \{\} 

它應該處理名稱中包含空格以及大量文件的文件。

+0

對不起,我正在尋找的結果是刪除了特殊字符。 – Schoffelman 2009-12-10 18:08:36

+0

對於Grundlefleck和上述解決方案,我得到一個 sed:1:「./index.html」:無效的命令代碼。 檢查是否有需要更改的系統/環境設置 - 但我不認爲這就是它 – Schoffelman 2009-12-15 17:43:33

0

與bash shell的

for file in *.* 
do 
    case "$file" in 
    *[^[:ascii:]]*) 
     mv "$file" "${file//[^[:ascii:]]/}" 
    ;; 
    esac 
done 
+0

我會努力爲好的「技巧」(但它不是一個關於移動文件的問題)。 – 2009-12-22 21:43:31