我有一个包含以下内容的文件:
[A hi] [B hello]
[A how] [A why] [C some where]
我基本上想用标记“A”提取“文本”,我的意思是
hi
how
why
在不同行的新文件中。我尝试使用sed
但我无法获得正则表达式。有人可以建议我用什么吗?
尝试使用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 扩展正则表达式”\K
regex 技巧,请参阅Support of \K in regex(这是一个高级环视 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
}
要学习正则表达式,请参阅
我不确定如何使用 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/很多,但我不能从经验中说它有多大用处。
这可能对您有用(GNU sed):
sed -r '/\[A\s+([^]]*)\]/{s//\n\1\n/;s/[^\n]*\n//;P};D' file