我知道我可能#include <stdint.h>
在前1-30行有C包。如果文件包含LARGE_INTEGER
GNU 工具的单词,我想将其添加到以前没有的行中。
替换 [0,1] 匹配
我首先想到总是按如下方式替换 [0,1] 匹配,但现在我认为额外的替换是不必要的,因此应该避免:
gsed -i '1-30s/^(#include <stdint.h>\n)?/#include <stdint.h>\n/'
我建议拒绝这一点。
额外的 ggrep 方法来表示不匹配
我认为这可能是一个很好的解决方案,因为它首先查看条件,然后在必要时进行替换。这线建议添加一个额外的 grep so 代码,其中 while 循环结构来自这里
while read -d '' -r filepath; do \
[ "$(ggrep -l "LARGE_INTEGER" "$filepath")" ] && \
[ "$(ggrep -L "#include <stdint.h>" "$filepath") ] \
| gsed -i '1s/^/#include <stdint.h>\n/' "$filepath"
done
然而这给出了
test.sh: line 5: stdint.h: No such file or directory
并且确实将包添加到没有#include <stdint.h>
太多的行中,这是错误的。
如何有效地组合 SED 的两个条件语句?
答案1
我不确定我是否正确解密了你的散文。下面的脚本将添加#include <stdint.h>
到当前目录中 (1) 包含单词LARGE_INTEGER
且 (2) 尚未包含 的文件<stdint.h>
:
sed -i -e '1i\' -e '#include <stdint.h>' $(
egrep -c '#include +<stdint\.h>' $( fgrep -lw LARGE_INTEGER * ) | \
sed -n '/:0$/ { s/:0$//; p; }')
该脚本假定为 GNU sed
(对于-i
)。
详细地:
fgrep -lw LARGE_INTEGER *
列出当前目录中包含该单词的文件LARGE_INTEGER
egrep -c '#include +<stdint\.h>'
计算上面#include <stdint.h>
找到的文件的出现次数fgrep
sed -n '/:0$/ { s/:0$//; p; }'
选择 0 个匹配的文件并仅保留文件名sed -i -e '1i\' -e '#include <stdint.h>'
将第一行添加#include <stdint.h>
到上面找到的文件中。