2012-06-25 17 views
0

我試圖使用後續替換幾個文件,逗號標籤:擊的sed在循環

#!/bin/sh 
for i in *output_*.txt 
do 
sed 's/ /;/g' $i > $i 
done 

但它不是在輸出文件,因爲工作,我仍然有標籤分隔符。當我在沒有使用for循環的單個文件上使用它時,它才起作用。

任何幫助?

謝謝。

+0

如何你插入製表符? bash將選項卡視爲完成,這可能會導致問題。大多數sed支持一個製表符,否則'tab = $'\ t''然後是'sed's/$ tab /;/g「$ i> $ i' – cdarke

+0

它看起來像是用空格替代分號。嘗試使用'sed -i's/\ t /,/ g'$ i'。 '-i'選項表示*就地*。 –

+0

嘗試使用啓用就地替換的sed的-i標誌。 – jpe

回答

3

有幾件事情是錯誤的。未更改的變量和輸出重定向到相同的文件。循環也是不需要的。

嘗試: sed -i 's/ /;/g' *output_*.txt

+0

我有不同的文件與不同的名稱,所以只是sed -i's//;/g'output_.txt將無法正常工作。 – g256

+0

是的,但問題是我需要寫入文件。我是通過覆蓋原始文件來做到這一點的。但有人指出sed首先創建一個空文件。 – g256

0

你需要正確的腳本如下:

find . -name '*output_*.txt' | while read FILENAME; do 
    (sed -e "s/\\t/;/g" <${FILENAME} >${FILENAME%.txt}.tmp) && (mv ${FILENAME%.txt}.tmp ${FILENAME}); 
done 

這個腳本有幾個重要的特點:

  1. 它發現在所謂*output_*.txt所有文件當前目錄和所有子目錄。如果您要遞歸到子目錄,然後使用:

    find . -maxdepth 1 -name '*output_*.txt' | while read FILENAME; do 
    

    的第一線。

  2. 如果sed遇到錯誤,則不覆蓋您的原始輸入文件。 sed生成其輸出到一個臨時文件(<filename>.tmp),它只會取代原始文件,如果它成功。

  3. 正如其他海報指出的那樣,製表符\tsed腳本表示。

由該腳本執行的示例變換如下(該序列<tab>表示標籤字符):

輸入:

 
    <tab><tab><tab><tab><tab>line 1<tab><tab> 
    <tab><tab><tab>line 2<tab><tab> 
    <tab><tab>line 3<tab><tab> 
    <tab><tab><tab>line 4<tab><tab> 
    <tab><tab><tab><tab><tab>line<tab><tab> 5 

輸出:

;;;;line 1;; 
    ;;;line 2;; 
    ;;line 3;; 
    ;;;line 4;; 
    ;;;;;line;; 5