sed 如果有或没有条件正确

sed 如果有或没有条件正确

我知道我可能#include <stdint.h>在前1-30行有C包。如果文件包含LARGE_INTEGERGNU 工具的单词,我想将其添加到以前没有的行中。

替换 [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>到上面找到的文件中。

相关内容