如何使用正则表达式搜索多个文件并输出与新文件中的行匹配的内容?

如何使用正则表达式搜索多个文件并输出与新文件中的行匹配的内容?

我有 1000 个源文件,我想找到与正则表达式匹配的所有文本,然后在生成的文本文件中将每个匹配项输出到其自己的行中。

例如;

// a.cs
string test = _.Text("Hello World!") + _.Text("Foo");
// b.cs
Debug.Log(_.ActionText("Bar"));

// results.txt
_.Text("Hello World")
_.Text("Foo")
_.ActionText("Bar")

哪个命令能够实现这一目标?你能举个例子吗?

答案1

sed '/\n/P;//!s/_\.[^ ("]*Text([^)]*)/\n&\n/;D' files... >results.txt

...可能会起作用。运行它打印的示例数据:

_.Text("Hello World!")
_.Text("Foo")
_.ActionText("Bar")

它所做的只是尝试将一行中的第一个匹配项括在\newlines 中。无论是否成功,它D都会删除\n模式空间中的第一个行 - 对于不匹配的行,这会将其从输出中完全删除,但对于匹配的行,仅删除模式的头部,并且脚本再次从顶部开始。如果\newline 在模式空间中匹配(只有在刚刚找到并删除匹配项时才会发生这种情况)D,则sed仅打印\n模式空间中第一个出现的 ewline(位于匹配字符串的末尾)。当模式空间中已经存在 ewline 时,不会尝试s///替换,因此elete 命令会清除已打印的匹配项,并且循环从最后一个匹配项的尾部重新开始。!\nD

不过,根据您的情况,sed您可能需要使用文字\newline 来代替n右侧替换字段中的 。但是您应该能够一次执行所有文件参数 - 或者至少一次执行很多参数(取决于您的 ARGMAX 限制)。你可以用 shell glob 来获取这些,或者也许......

find /path -name pattern -exec sed script_above {} + >>results.txt

...因为sed会将所有输入文件视为单个流。

答案2

您可以使用 grep。

grep -Eo '_\.\w+\("[^"]+"\)'

相关内容