1

我有一个包含以下内容的文件:

[A hi] [B hello]
[A how] [A why] [C some where]

我基本上想用标记“A”提取“文本”,我的意思是

hi
how
why

在不同行的新文件中。我尝试使用sed但我无法获得正则表达式。有人可以建议我用什么吗?

4

3 回答 3

1

执行此操作:

grep -oP '\[A\s+\K[^\]]+' file.txt > new_file.txt

或者

grep -oP '\[A\s+\K[^\]]+' file.txt | tee new_file.txt

结果

hi
how
why

解释

  • -ogrep 代表“只获取匹配的部分”
  • -Pgrep 代表“Perl 扩展正则表达式”
  • 对于\Kregex 技巧,请参阅Support of \K in regex(这是一个高级环视 regex 技巧)

中带有注释的相同正则表达式:

use strict; use warnings;
use feature qw/say/;

while (<>) {
    say for 
        /           # starting regex
            \[A     # a literal "[" and "A"
            \s+     # at least one whitespace (\n, \r, \t, \f, and " ")
            \K      # restart the match
            [^\]]+  # at least one character that is not a literal "]"
        /gsx;       # end of the regex and the modifiers
}

链接

要学习正则表达式,请参阅

于 2013-01-26T16:07:09.950 回答
0

我不确定如何使用 sed 执行此操作(不太熟悉),但您可以将 GNU grep 与 Perl 兼容的正则表达式一起使用(请参阅此答案以获取另一个示例)。

这是我为您的测试输入整理的快速正则表达式(假设您的数据位于名为“foo”的文件中):

cat foo | grep -Po '(?<=\[A )[^\]]+'

这输出:

hi
how
why

更新- 这是如何工作的:

正则表达式的第一部分(?<=\[A )使用负向回溯,这基本上意味着您确保认为您正在寻找的东西前面有一些东西(在这种情况下\[A)。这有助于为您正在寻找的内容提供背景信息。这也可以通过捕获组来完成,但是由于我以前没有使用 grep 做过这种事情,所以我不确定如何在这里使用它们。其中一个lookbehinds的语法是(?<=THING_TO_PRECEDE_YOUR_MATCH_WITH).

第二个块只是说“找到[^\]]+一个或多个不是\]. 我们刚刚提到的一项或多项。[^CHARSET]+

根据您对正则表达式的经验,这可能会或可能不会有帮助,如果有什么我可以更好地解释的地方,请告诉我。我不确定学习这些的最佳地点。经常使用 python,我发现它们的语法参考非常方便。此外,谷歌往往指向http://www.regular-expressions.info/很多,但我不能从经验中说它有多大用处。

于 2013-01-26T15:53:23.263 回答
0

这可能对您有用(GNU sed):

sed -r '/\[A\s+([^]]*)\]/{s//\n\1\n/;s/[^\n]*\n//;P};D' file
于 2013-01-26T22:15:31.707 回答