假设@glennjackman 发布了答案:
awk '/#undef LZZ_INLINE/{next} /#ifdef LZZ_ENABLE_INLINE/{x=1;next}x&&/#endif/{x=0;next} 1' file
是正确的,您只想就地更新输入文件,这是使用 awk 执行此操作的一种方法:
awk '/#undef LZZ_INLINE/{next} /#ifdef LZZ_ENABLE_INLINE/{x=1;next}x&&/#endif/{x=0;next} {out[++nr]=$0} END{close(FILENAME); for (i=1;i<=nr;i++) print out > FILENAME}' file
(即将1替换为{out[++nr]=$0} END{close(FILENAME); for (i=1;i<=nr;i++) print out > FILENAME})
这是另一个:
awk '/#undef LZZ_INLINE/{next} /#ifdef LZZ_ENABLE_INLINE/{x=1;next}x&&/#endif/{x=0;next} {print > "/tmp/\""FILENAME"\"" } END{system("mv /tmp/\""FILENAME"\" \""FILENAME"\""}' file
(即将1替换为{print > "/tmp/\""FILENAME"\"" } END{system("mv /tmp/\""FILENAME"\" \""FILENAME"\""})
如何实现它有一些变化,但基本思想只是缓冲输出,直到您完成读取输入文件然后覆盖输入文件。 NBD 无论哪种方式...
我应该提到的另一个变体是创建一个 tmp INPUT 文件,它看起来像这样:
awk '
BEGIN{
tmp="/tmp/\"" ARGV[1] "\""
while ( (getline var < ARGV[1]) > 0 ) {
print var > tmp
}
close(tmp)
out = ARGV[1]
ARGV[1] = tmp
}
/#undef LZZ_INLINE/{next} /#ifdef LZZ_ENABLE_INLINE/{x=1;next}x&&/#endif/{x=0;next} {print > out}' file
您使用 system("mv...") 还是 getline 循环是风格还是取决于您的操作系统提供的内容。