无法在 sed 替换中发现错误

无法在 sed 替换中发现错误

我正在尝试用相同的包含保护替换标题中的包含保护,并在前面加上#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"`

相关内容