1

我有以下代码布局:

#ifndef _file_h_
#define _file_h_

namespace FooBar
{
    // code
}

#endif

我想通过 sed 运行它并将 FooBar 命名空间转换为 Foo::Bar 并添加右括号

#ifndef _file_h_
#define _file_h_

namespace Foo { namespace Bar {

// code

}}

#endif

我承认我的正则表达式知识在最好的时候是很差的。

我认为我下面的命令接近于实现我正在寻找的东西,但我得到了一些语法错误。有人可以帮忙吗?

cat file.h  | sed -e 's/(.*)namespace FooBar[\s\n]{(.*)}/\1namesapce Foo \{ namespace Bar \{\2\}\}/g' | less
4

2 回答 2

1

希望你的头文件的格式总是像你展示的那样(命名空间在它自己的行上,在行首打开/关闭大括号等)。

如果是这样,您无需担心在此处捕获。尝试:

sed -e 's/namespace FooBar/namespace Foo { namespace Bar/g; s/^}/}}/g;' file.h > file2.h

如果没有,请牢记@sarnold 的评论——这将很困难。

于 2012-05-21T23:17:54.987 回答
1

知道最后一个大括号始终是文件中的最后一个大括号,这给了我一个可行的想法:

首先,窃取 Rob 的第一个正则表达式:

sed -ie 's/namespace FooBar/namespace Foo { namespace Bar/g;' file.h

接下来,最后一个大括号的新正则表达式:

perl -pi -e 's/^}$(.*?)\z/}}\1/ms' file.h

我为第二个命令切换到 Perl,因此我可以使用它的不那么贪婪的*?运算符、^and$\z断言以及/ms修饰符(以获得友好的多行匹配)。

这两个命令结合起来对您的示例文件进行了以下更改:

$ diff -u file.h.backup file.h
--- file.h.backup   2012-05-21 16:27:29.000000000 -0700
+++ file.h  2012-05-21 16:29:31.000000000 -0700
@@ -1,10 +1,10 @@
 #ifndef _file_h_
 #define _file_h_

-namespace FooBar
+namespace Foo { namespace Bar
 {
     // code
-}
+}}

 #endif

脆弱——一个完整的 C++ 语言解析器会更加健壮,尽管编写起来肯定不是那么容易。我希望剩下的东西很容易用手处理。

于 2012-05-21T23:33:55.900 回答