2012-10-05 74 views
0

我想編寫一個shell程序來搜索我當前的目錄(比如我的文件夾包含C代碼),讀取關鍵字「printf」或「fprintf」的所有文件,並追加包括對文件的聲明,如果它尚未完成。Shell編程文件搜索和追加

我試圖編寫搜索部分(現在,它所做的只是搜索文件並打印匹配文件的列表),但它不起作用。下面是我的代碼。我究竟做錯了什麼?

Code

編輯:新的代碼。

#!/bin/sh 
#processes files ending in .c and appends statements if necessary 

#search for files that meet criteria 
for file in $(find . -type f) 
do 
    echo $file 
    if grep -q printf "$file" 
    then 
     echo "File $file contains command" 
    fi 
done 

回答

1

要在子shell中執行命令,您需要$(command)。注意括號前的$

您不需要的文件列表存儲在一個臨時變量,你可以直接使用

for file in $(find .) ; do 
    echo "$file" 
done 

而且隨着

find . -type f | grep somestring 

搜索文件內容但文件名稱(在我的例子中所有文件名稱包含「somestri NG「)

到grep的文件的內容:

for file in $(find . -type f) ; do 
    if grep -q printf "$file" ; then 
    echo "File $file contains printf" 
    fi 
done 

請注意,如果你匹配printf它也將匹配fprintf(因爲它包含printf

如果你要搜索只是文件與.c結束,你可以使用-name選項

find . -name "*.c" -type f 

使用-type f選項僅列出文件。

在任何情況下檢查,如果你的grep-r選項搜索遞歸

grep -r --include "*.c" printf . 
+0

是的,你不是格雷文件,但文件名看到我的編輯 – Matteo

+0

謝謝你的信息!這是一個很大的幫助。 – user41419

+0

如果問題解決了您的問題,您可以通過箭頭下方的「OK」符號接受投票 – Matteo

0

你可以做這樣的事情與sed -i,但我覺得反感。相反,對於流使用edseded)似乎是合理的,因此在不使用流時使用ed是有意義的)。

#!/bin/sh 

for i in *.c; do 
    grep -Fq '#include <stdio.h>' $i && continue 
    grep -Fq printf $i && ed -s $i <<EOF> /dev/null 
1 
i 
#include <stdio.h> 
. 
w 
EOF 
done 
+1

在對Matteo答案的評論中,你提到你的grep不支持'-q'。如果是這樣的話,用'grep -F printf $ i>/dev/null'替換'grep -Fq printf $ i' –