首頁 »
2009/01/13

[bash] 尋找目錄下檔案裡某特定的字串,並移除它們

之前遇到了要處理一堆名單檔的需求,其中有個常態性需求是:「把某個使用者的資訊從近幾個月名單檔中移除」
例如:我想要把名單檔中有:m=nobody@earth.org.tw&guid=nobody 的字串完全移除:
第一次寫了

#!/usr/local/bin/bash

for month in 09 10 11 12; do
   for file in /home/abc/data/list/2008.${month}/*.list ; do
      echo 'we are processing '$file
      sed 's/m=nobody@earth.org.tw\&guid=nobody//g' ${file} > TMPFILE && mv TMPFILE ${file}
      sed '/^$/d' ${file} > TMPFILE && mv TMPFILE ${file}
   done
done


後來呢,發現不大對,上面那支會把所有的名單檔都納入考量,所以名單檔一多時,就要等很久才能執行完畢,所以又改寫了一支,如下:
主要的差異是:下方這支程式會先找出有含特定字串的檔案,再去真的把這些檔案中的特定字串移除

#!/usr/local/bin/bash

######################################################
# Purpose: find some keyword in list files and remove them
# Author: Jiing Deng
######################################################

for month in 09 10 11 12; do
list=(`find /home/abc/data/list/2008.${month}/ -name "*.list" -exec grep -q "m=nobody@earth.org.tw\&guid=nobody" "{}" \; -print`)
   # echo ${list[@]}
   for file in "${list[@]}" ; do
      echo 'we are processing '$file
      sed 's/m=nobody@earth.org.tw\&guid=nobody//g' ${file} > TMPFILE && mv TMPFILE ${file}
      sed '/^$/d' ${file} > TMPFILE && mv TMPFILE ${file}
   done
done

關鍵字: 名單 常態

[bash] 移除文字檔中的^M←上一篇 │首頁
本文引用網址: