GNU 找到这个但不是那个并执行 Sed 吗?

GNU 找到这个但不是那个并执行 Sed 吗?

代码

find /tmp/ -type f                                      \
    \( -name "*.h" \) -o \( -name "*.cpp" \) -o         \
    \( \! -name "*.bak" \) -exec                        \
    sed -i '1s/^/#include <stdint.h>\n/' {} +

我不完全确定这是正确的方法。我直接写入文件而不使用临时文件。我想替换行的开头。H.cpp文件包含但不包含在.bak文件。

如何进行高效替换?注意:我正在使用 GNU sed


我尝试了 Terdon 的命令,插入应用于错误的文件:

$ cat test.sh 
gfind /tmp/ -type f   \
    \( -name "*.h" -o -name "*.cpp" -o ! -name "*.bak" \) \
    -exec gsed -i '1s/^/#include <stdint.h>\n/' {} +    
$ sh test.sh 
$ cat test.sh    
#include <stdint.h>
gfind /tmp/ -type f   \
    \( -name "*.h" -o -name "*.cpp" -o ! -name "*.bak" \) \
    -exec gsed -i '1s/^/#include <stdint.h>\n/' {} +

其中所有命令都是 GNU:find 和 sed。

答案1

尝试这个:

find /tmp/ -type f  -name "*.h" -o -name "*.cpp"  \
           -exec  sed -i '1s/^/#include <stdint.h>\n/' {} +

另外,正如我正确指出的那样,这! -name "*.bak"是多余的。该-name *foo模式仅匹配以foo.因此,*.cpp*.h已经排除了*.bak

相关内容