我正在尝试用相同的包含保护替换标题中的包含保护,并在前面加上#pragma once
:
#ifndef _HELLO_H
#define _HELLO_H
变成:
#pragma once
#ifndef _HELLO_H
#define _HELLO_H
另外,我希望保留行尾的原样。如果是 LF,则使用 LF,如果是 CRLF,则使用 CRLF。
我想出了以下命令:
find . -type f -name "*.h" -print0 | xargs -0 sed -i -E -e 's/#ifndef ([a-zA-Z_][a-zA-Z_0-9]+)(\r?\n)#define \1/#pragma once\2#ifndef \1\2#define \1/g'
但我只是替换了所有标题中的行尾,并没有#pragma once
添加任何内容。
在 Windows 下的 MSYS2 终端内执行的命令。
答案1
找到了问题的根本原因——这是因为 sed 默认不匹配多行。
另外,在这里找到了一些解决方案:如何使用 sed 替换多行字符串?
针对我的特殊情况的有效解决方案(使用 perl 而不是 sed):
perl -0777 -piE 's/#ifndef ([a-zA-Z_][a-zA-Z_0-9]+)(\r?\n)#define \1/#pragma once\2#ifndef \1\2#define \1/gs' `find . -type f -name "*.h"`