不能把正则表达式和列表结果放在一起

时间:2016-10-31 11:11:35

标签: regex linux grep

我对正则表达式相当新,所以如果这似乎过于笼统,那么道歉。

情景:

我有一组文件,其中我已经隔离了一个特定的模式,比如[mainpattern]。在每个模式出现时,[mainpattern]前面都有各种[子模式]出现,前面有一个右箭头,后面有一个点:

  

cat * .txt | grep“mainpattern”

... [>] [subpattern1] [。] [mainpattern] ...

... [>] [subpattern2] [。] [mainpattern] ...

...

... [>] [subpatternN] [。] [mainpattern] ...

我基本上尝试生成一个输出,其中所有子模式都是唯一列出的(没有重复)。有任何想法吗?我无法弄清楚如何编写“从grep输出中获取前面的单词”。

非常感谢

2 个答案:

答案 0 :(得分:0)

您可以将PCRE样式的正则表达式(?<=>)[^>.]*(?=[.]mainpattern)-oP选项一起使用(P用于PCRE,o用于输出匹配模式):

grep -oP '(?<=>)[^>.]*(?=[.]mainpattern)'

模式匹配:

  • (?<=>) - 字符串中以>
  • 开头的位置
  • [^>.]* - 匹配零或更多(以匹配1个或多个使用+)字符而不是>.
  • (?=[.]mainpattern) - 一个积极的前瞻,要求在消费(前一个)子模式之后出现.mainpattern

答案 1 :(得分:0)

正如@WiktorStribiżew所说,你可以使用正则表达式。 对于uniq列表,您只需添加sortuniq,例如:

pcregrep -o '(?<=>).*?(?=\.mainpattern)' *.txt | sort | uniq