2015-04-29 59 views
0

我試圖創建一個shell搜索和替換函數來替換目錄中的所有字符串。問題是如何獲得遞歸grep的輸出並使用它來查找sed使用的文件?如何獲得遞歸grep的輸出並將其分解爲像變量這樣的數組?

我有以下管道grep -R protal ./ | sed 's/:.*//g' | sed 's/\/\//\//g'。它產生這樣的輸出:

./settings.py 
./settings.py 
./settings.py 
./urls.py 
./wsgi.py 
./wsgi.py 

我想借此把它分解成一個數組或東西,所以我可以做的(僞代碼):

for [[ $file in $file_list ]]; do 
    sed -i 's/$input_string/$replace_value/g' $file 
done 

我將如何做呢?

回答

2

而不是試圖解析文件列表(當你在文件名中的空格或換行符這可能是一個問題),我會做這件事與find及其-exec過濾:

find . -type f -exec grep -q protal '{}' \; -exec sed -i "s/$input_string/$replace_value/" '{}' \; 

訣竅是,

  • -exec濾波器僅通過如果與退出狀態0該命令返回,
  • grep -q protal file.txt返回與退出狀態0僅當file.txt包含protal,並且
  • 第二-exec濾波器,因爲它是後鏈式首先,只有在第一個過濾器通過時纔會嘗試(僅執行關聯的命令)。

對當前目錄下包含protal的常規文件運行sed -i "s/$input_string/$replace_value/"會產生影響。

+0

這是唯一明智的答案。 –

+0

好的,所以我喜歡這個答案,但它肯定比我最初的想法好,但是,我得到一個錯誤。 sed返回sed:1:「./file」:無效的命令代碼。「怎麼了? – Jonathan

+0

其中一個shell變量是否包含斜槓?如果是這樣,請參閱https://stackoverflow.com/questions/5864146/use-slashes-in-sed-replace – Wintermute

0
for file in $(grep -R protal ./ | sed 's/:.*//g' | sed 's/\/\//\//g'); do 
#yourcode 
done 
0

只需使用xargs

grep -R protal ./ | sed 's/:.*//g' | sed 's/\/\//\//g' | xargs sed -i 's/$input_string/$replace_value/g' 
相關問題