代码
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
。