我有一个包含以下内容的文件:
[A hi] [B hello]
[A how] [A why] [C some where]
我基本上想用“A”标记
来提取“文本”hi
how
why
在单独行的新文件中。
我尝试使用sed
,但我无法获得正则表达式。有人可以建议我可以使用什么?
答案 0 :(得分:1)
尝试使用grep执行此操作:
grep -oP '\[A\s+\K[^\]]+' file.txt > new_file.txt
或
grep -oP '\[A\s+\K[^\]]+' file.txt | tee new_file.txt
hi
how
why
-o
对于grep代表“只获得匹配的部分”-P
代表grep代表“Perl extented regex”\K
正则表达式技巧,请参阅Support of \K in regex(这是一种高级环顾正则表达式技巧)perl中带有注释的相同正则表达式:
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
}
要学习正则表达式,请参阅
答案 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