【问题标题】:Parsing and editing source code using bash-script使用 bash-script 解析和编辑源代码
【发布时间】:2015-12-17 17:42:48
【问题描述】:

我确实有几个包含以下行的源代码文件 (.cpp):

other stuff
...
TRACE(arg1, arg2, ...);
...
other stuff

其中 arg1, arg2, ... 表示任意函数调用参数,以逗号分隔,并且可能以空格开头。

目标是解析我项目中每个源文件中的每一行,并从函数调用TRACE中去掉第一个参数(arg1),比如

TRACE(arg2, arg3, ...);

请注意,函数 TRACE 前面可以有任意数量的空格,并且它本身可以包含字符串 TRACE,例如

TRACE(0, TRACE_INFO, "Test ");
    TRACE(  0 , TRACE, 4,5 ,6);

有没有简单的方法?

测试文件 test.cpp 包含:

   TRACE( "I2Ccontrol::I2Ccontrol", TRACE_FATAL,0);

3 个空格,无前行无后行

【问题讨论】:

    标签: bash shell parsing


    【解决方案1】:

    将 sed 与扩展正则表达式一起使用:

    sed -r 's/(\bTRACE\()([^",]+,\s*|\s*"[^"]*"\s*,\s*)(.*\);)/\1\3/' file
    

    要就地更改文件,请使用sed --in-place -r ...

    编辑:

    测试来自评论的输入:

    echo '   TRACE( "I2Ccontrol::I2Ccontrol", TRACE_FATAL,0);' |sed -r 's/(\bTRACE\()([^",]+,\s*|\s*"[^"]*"\s*,\s*)(.*\);)/\1\3/'
    #three white space before TRACE
    

    输出:

       TRACE(TRACE_FATAL,0);
    

    【讨论】:

    • 太棒了。此解决方案支持arg1 值中的偶数逗号。
    • 非常感谢!这也适用于多个文件,例如: sed --in-place -r ... file1 file2 ... ?
    • 但是现在每个括号后面不会有空格吗?如 TRACE(arg2,...
    • 真正的只是编码风格的一致性。不过我还有一个问题:函数调用可能如下所示:TRACE(0, TRACE_INFO, "Test", ... 这不仅会删除 0,还会删除 arg2 在这种情况下 TRACE_INFO 这肯定是一个真正的问题跨度>
    • 不起作用。 test.cpp 的内容:TRACE("I2Ccontrol::I2Ccontrol", TRACE_FATAL,0); (前面有 3 个空格)以下命令 sed --in-place -r 's/(\bTRACE()([^",]+,\s*|\s*"[^"]*",\s *)(.*);)/\1\3/' test.cpp 完全不影响文件 test.cpp
    最近更新 更多