我有 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")
它所做的只是尝试将一行中的第一个匹配项括在\n
ewlines 中。无论是否成功,它D
都会删除\n
模式空间中的第一个行 - 对于不匹配的行,这会将其从输出中完全删除,但对于匹配的行,仅删除模式的头部,并且脚本再次从顶部开始。如果\n
ewline 在模式空间中匹配(只有在刚刚找到并删除匹配项时才会发生这种情况)D
,则sed
仅打印\n
模式空间中第一个出现的 ewline(位于匹配字符串的末尾)。当模式空间中已经存在 ewline 时,不会尝试s///
替换,因此elete 命令会清除已打印的匹配项,并且循环从最后一个匹配项的尾部重新开始。!
\n
D
不过,根据您的情况,sed
您可能需要使用文字\n
ewline 来代替n
右侧替换字段中的 。但是您应该能够一次执行所有文件参数 - 或者至少一次执行很多参数(取决于您的 ARGMAX 限制)。你可以用 shell glob 来获取这些,或者也许......
find /path -name pattern -exec sed script_above {} + >>results.txt
...因为sed
会将所有输入文件视为单个流。
答案2
您可以使用 grep。
grep -Eo '_\.\w+\("[^"]+"\)'