需要一个正则表达式来提取数据和写入文件

时间:2013-01-26 15:35:18

标签: perl sed awk grep

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

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

我基本上想用“A”标记

来提取“文本”
hi
how
why

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

3 个答案:

答案 0 :(得分:1)

尝试使用执行此操作:

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

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

RESULT

hi
how
why

说明

  • -o对于grep代表“只获得匹配的部分”
  • -P代表grep代表“Perl extented regex”
  • 对于\K正则表达式技巧,请参阅Support of \K in 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
}

LINKS

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

答案 1 :(得分:0)

我不确定如何使用sed(不太熟悉它),但你可以将GNU grep与Perl兼容的正则表达式一起使用(另请参阅this answer)。

这是我为测试输入放在一起的快速正则表达式(假设您的数据位于名为'foo'的文件中):

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

输出:

hi
how
why

更新 - 工作原理:

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

第二个块[^\]]+只是说“找到一个或多个不是\]的字符。请注意,我们必须转义方括号,因为它们表示正则表达式中的某些内容。{{1}除了一些给定的字符集或字符类之外,我只是说了什么。[^CHARSET]只是说找到我们刚刚提到的一个或多个。

根据您对正则表达式的体验,这可能会有所帮助,也可能没有帮助,请告诉我是否有任何可以更好解释的要点。我不确定学习这些的最佳位置。经常使用python后,我发现他们的syntax reference非常方便。此外,谷歌往往指向http://www.regular-expressions.info/很多,但我不能从经验中说它是多么有用。

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed -r '/\[A\s+([^]]*)\]/{s//\n\1\n/;s/[^\n]*\n//;P};D' file