GNU 找到这个但不是那个,然后做 Sed?

Léo*_* 준영 3 sed find

代码

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

我不完全确定这是正确的方法。我直接写入文件而不使用临时文件。我想用.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/' {} +
Run Code Online (Sandbox Code Playgroud)

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

ter*_*don 7

尝试这个:

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

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