0

我正在尝试编写一个 shell 程序,它将搜索我的当前目录(例如,我的包含 C 代码的文件夹),读取关键字“printf”或“fprintf”的所有文件,如果不是,则将包含语句附加到文件中t 已经完成了。

我已经尝试编写搜索部分(目前,它所做的只是搜索文件并打印匹配文件的列表),但它不起作用。下面是我的代码。我究竟做错了什么?

代码

编辑:新代码。

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

要在子 shell 中执行命令,您需要$( 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相反,使用( sedis for 流似乎是合理的,因此当您不使用流时ed使用它是有意义的)。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 回答