这个bash代码替换文件中的单词有什么问题?

时间:2016-07-18 16:08:18

标签: bash sed

几个月前我写了这段代码并且没有再触摸它。现在我把它拿起来完成它。这是一个更大的脚本的一部分,用于查找具有特定扩展名的所有文件,查找哪些文件具有特定单词,并将该单词的每个实例替换为另一个单词。

在这段摘录中,ARG4是它开始查看的目录(它继续递归)。 ARG2就是它所寻找的词。 ARG3是取代ARG2的词。

        ARG4="$4"
        find -P "$ARG4" -type f -name '*.h' -o -name '*.C' \
-o -name '*.cpp' -o -name "*.cc" \
-exec grep -l "$ARG2" {} \; | while read file; do
                echo "$file"
                sed -n -i -E "s/"$ARG2"/"$ARG3"/g" "$file"
        done

就像我说它已经有一段时间了,但我已经阅读了代码,我觉得这很容易理解。我认为问题必须在while循环中。我用Google搜索了关于"的更多信息,同时阅读---"但我找不到多少。

编辑2:请参阅下面的答案以获得解决方案。

2 个答案:

答案 0 :(得分:1)

我发现find无法正常工作。事实证明,这是因为-maxdepth 0我放在那里,所以搜索只会发生在当前目录中。我拿出来了,但是find的输出是一个包含所有文件名的字符串。它们需要是独立的实体,以便while循环可以读取每个实体。所以我重新写了一遍:

        files=(`find . -type f \( -name "*.h" -o -name "*.C" -o \
-name "*.cpp" -o -name "*.cc" \) \
-exec grep -l "$ARG1" {} \;`)
        for i in ${files[@]} ; do
                echo $i
                echo `gsed -E -i "s/$ARG1/$ARG2/g" ${i}`
        done

我不得不安装GNU sed,常规的只是不接受文件名。

答案 1 :(得分:0)

很难说这是否只是 问题,因为您还没有确切地说出错误的原因。但是,您的find命令的-exec操作仅适用于*.cc个文件。如果您希望它适用于其中任何一个,它应该看起来更像:

        ARG4="$4"
        find -P "$ARG4" -type f \( -name '*.h' -o -name '*.C' \
-o -name '*.cpp' -o -name "*.cc" \) \
-exec grep -l "$ARG2" {} \; | while read file; do
                echo "$file"
                sed -n -i -E "s/"$ARG2"/"$ARG3"/g" "$file"
        done

请注意添加的()用于分组,以便将操作附加到所有这些操作的结果中。

相关问题