0

現在のディレクトリ (たとえば、C コードを含むフォルダー) を検索し、キーワード "printf" または "fprintf" のすべてのファイルを読み取り、ファイルに include ステートメントがない場合は追加するシェル プログラムを作成しようとしています。すでに完了しています。

すでに検索部分を書き込もうとしましたが (今のところ、ファイルを検索して一致するファイルのリストを出力するだけです)、うまくいきません。以下に含まれているのは私のコードです。私は何を間違っていますか?

コード

編集: 新しいコード。

#!/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
4

2 に答える 2

0

サブシェルでコマンドを実行するには、$( command ). $括弧の前に注目してください。

ファイルのリストを一時変数に保存する必要はありません。直接使用できます

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

そして

find . -type f | grep somestring

ファイルの内容ではなくファイルを検索しています(私の例では、名前に「somestring」が含まれるすべてのファイル)

ファイルの内容を 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 .
于 2012-10-05T05:25:22.147 に答える
0

でこの種のことができますがsed -i、それは不快です。代わりに、ed(sededストリーム用なので、ストリームを操作し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
于 2012-10-05T05:35:12.140 に答える