【发布时间】:2013-03-08 13:25:32
【问题描述】:
我有大量文件,我想在其中进行搜索。
我想查找被X 包围的所有单词,并且只查找单词。我用后视和前瞻来做到这一点:
grep -rhoP "(?<=X)[a-zA-Z0-9_]*(?=X)" .
现在我想知道之前的结果中是否有带有完整上下文的单词被Y 包围。我可以为一个特定的单词做到这一点abc
grep -rP "(?<=Y)abc(?=Y)" .
但是我怎样才能将这两个命令连接在一起呢?
更新
我有大量的 C 文件。 我们所有的 api 函数首先在我们的许多 .h 文件之一中声明,并在我们的许多 .c 文件和内联 .h 文件之一中使用。
有些函数可能不能直接访问,而是通过函数指针访问,但事实证明这对开发来说是一个很大的障碍。为此,我们制作了一些宏(FP 和 CALL),以便能够轻松打开和关闭此要求。
FP(DoThis)
void DoThis(void);
- 在要求 ON 的情况下,
FP定义了一个函数指针 - 在本例中为DoThis- 稍后可以通过使用CALL(DoThis)();来使用它。 - 在要求 OFF 的情况下,
FP扩展为空,CALL(DoThis)扩展为仅DoThis。
可以通过以下方式获取以这种方式创建函数指针的所有函数的列表:
grep -rhoP "(?<=FP\()[a-zA-Z0-9_]*(?=\))" .
可以通过以下方式获取使用 DoThis 函数的函数指针的所有位置的列表:
grep -rP "(?<=CALL\()DoThis(?=\))" .
现在我想要一个所有位置的列表,其中可以获取使用FP 和CALL 创建的任何函数的函数指针。
所以不知何故,我想将两个 grep 链接在一起,以便将第一个 grep 的每个结果都提供给第二个,并将最终结果组合在一起。
【问题讨论】:
-
grep -rhoP "(?<=X)[a-zA-Z0-9_]*(?=X)" .|grep -P "(?<=Y).*(?=Y)"对你有用吗? -
@Kent 否。第二个 grep 的结果可能来自与第一个 grep 的结果不同的文件。第二个 grep 确实需要再次搜索所有文件。
-
哦,我误会你了。所以这两个 grep 彼此没有任何关系,但你想一口气得到结果。那么这个呢?
grep -rhoP "(?<=X)[a-zA-Z0-9_]*(?=X)|(?<=Y)[a-zA-Z0-9_]*(?=Y)" . -
所以这是使用
grep -e something -e someotherthing的问题,对吧? -
@kent 感谢您的想法,但我似乎不擅长提出正确的问题。我更新了它,希望现在会更清楚。