Grep 通过格式化代码并将输出重定向到多行

Grep through formatted code and redirect output to multiple lines

我需要为函数 AbcXyz( 搜索目录中的所有文件,并将输出转储到单个文件。但有 2 个注意事项:

  1. 我需要将 grep 输出重定向到单独的行,即识别出的每个 AbcXyz(...) 实例都必须出现在单独的行中。

  2. 该函数有很多参数,可能不会出现在一行中

在代码中:

   AbcXyz(param1, param2, "Some message .... 
          .... Some more message", param3)

Grepped 输出:

AbcXyz(param1, param2, "Some message ........ Some more message", param3)

我该怎么做?

Regex (grep) for multi-line search needed 可能会有帮助。

简而言之:

  1. 尝试awk awk '/Abc/,/\)/' your_file - 将查找并打印从 'Abc' 到 ')' https://www.gnu.org/software/gawk/manual/html_node/Ranges.html (7.1.3).

    的模式
  2. grep + 正则表达式(参见 link)

如果不为您的输入文件包含的任何语言编写解析器,而是使用 GNU awk 为多字符 RS 并假设您的输入始终如您所显示的那样,等等,就无法稳健地完成:

awk -v RS='AbcXyz[(][^)]*)' 'RT{[=10=]=RT; =; print}' file

例如:

$ cat file
   AbcXyz(param1, param2, "Some message ....
          .... Some more message", param3)
   AbcXyz(param1, param2,
                 "Some message ....
          .... Some more message",
 param3)
   AbcXyz(param1, param2, "Some message .... .... Some more message", param3)

$ awk -v RS='AbcXyz[(][^)]*)' 'RT{[=12=]=RT; =; print}' file
AbcXyz(param1, param2, "Some message .... .... Some more message", param3)
AbcXyz(param1, param2, "Some message .... .... Some more message", param3)
AbcXyz(param1, param2, "Some message .... .... Some more message", param3)