2015-06-22 111 views
1

位於目錄中的十個文件。每個文件內容都有「蘋果」字樣。編寫一個bash shell腳本,在所有十個文件中用「banana」替換「apple」,並打印每個文件的替換數目。以這種方式嘗試過,但不知道如何獲得替換的數量。任何人都可以幫忙嗎?和sed只在顯示修改實際的文件沒有得到修改用於計數替換的shell腳本

#!/bin/bash 
for f in *.txt 
do sed 's/apple/banana/g' $f 
done 
+3

當你說一個 「shell腳本」,你的意思是bash的,ksh的,別的嗎?也許添加相關標籤。另外,你正在試圖解決的問題是什麼?有些背景可能不錯,因爲這聽起來像是作業。 – wmorrison365

+0

請勿在註釋中使用代碼。相反,[編輯]顯示它的問題。 – fedorqui

+0

又見質疑[如何做 - 檢查 - 如果最沉渣 - 命令替換,一些字符串](http://stackoverflow.com/questions/15433058/how-to-check-if-the-sed-命令替換一些字符串) – wmorrison365

回答

1

假設你想在內容的文件並沒有對與「香蕉」(精確匹配)一詞取代「蘋果」文件的名稱(見上面我的評論),以及您所使用的bash外殼:

#!/bin/bash 

COUNTER=0 

    for file in *.txt ; do 
     COUNTER=$(grep -o "\<apple\>" $file | wc -l) 
     sed -i 's/\<apple\>/banana/g' $file 
     echo "RESULT: $COUNTER replacements in file $file" 
     let COUNTER=0 
    done 

exit 0; 

說明:

  • 要計算每一個文件,你可以使用grep-o標誌打印所有你想要更換的話(在每一個新行)和管道,結果火柴wc -l(其中計數新行)的替代品。結果存儲在屏幕上打印的變量中,然後在處理每個文件後重置。
  • 如果你想sed實際預製棒中的文件替換時,必須指定-i標誌,否則將替代在標準輸出上進行。
  • 該腳本將僅替換詞「蘋果」完全匹配。因此,例如,'蘋果'一詞將而不是''替換爲'香蕉'。如果你想要一個不同的行爲,只需在單詞'apple'周圍刪除單詞分隔符(單詞分隔符是\<\>)。
+0

是這個工作。感謝您的回覆... – Bubbles

+0

任何鏈接suggestible練習「sed」和「awk」命令請發佈鏈接 – Bubbles

+1

@ Bubbles如果這對你有用,請點擊左邊的刻度標記,接受它。 至於練習「sed」和「awk」命令,這些是最好的教程和我可以從文檔本身找到的最佳參考: http://www.grymoire.com/Unix/Sed.html http:///www.grymoire.com/Unix/Awk.html – Frank