如何使用Grep和RegEx查找指定单词前后的字符串

如何使用Grep和RegEx查找指定单词前后的字符串,regex,bash,shell,unix,Regex,Bash,Shell,Unix,例如,我有一个包含ff字符串集的文件 AAA1111BBB -> FILE1 AAA2222BBB -> FILE2 AAA3333BBB -> FILE3 现在在unix中,我想通过搜索AAA作为行的开始,BBB作为模式的结束来提取所有ID。输出将是这样的 1111 2222 3333 然后我想删除所有重复条目,然后将其保存在文件中。我怎样才能做到这一点呢?如果你有grep-p选项,你可以试试 (?<=A{3})\d+(?=B{3}) (?好吧,您的小示例可以通过

例如,我有一个包含ff字符串集的文件

AAA1111BBB -> FILE1
AAA2222BBB -> FILE2
AAA3333BBB -> FILE3
现在在unix中,我想通过搜索AAA作为行的开始,BBB作为模式的结束来提取所有ID。输出将是这样的

1111
2222
3333

然后我想删除所有重复条目,然后将其保存在文件中。我怎样才能做到这一点呢?

如果你有
grep-p
选项,你可以试试

(?<=A{3})\d+(?=B{3})

(?好吧,您的小示例可以通过以下命令完成:

sed -e 's/^AAA//' -e 's/BBB.*//' input.txt | sort -u > output.txt
但是,我的猜测是,您的玩具示例可能无法准确解释您试图通过GNU awk实现的目标。

gawk '
    match($1, /^AAA(.*)BBB$/, m) {keys[m[1]]=1}
    END {for (k in keys) print k}
' file
或perl

perl -nE '/^AAA(\w+)BBB/ and $k{$1}=1 }END{ say join "\n", keys %k' file

我假设您的ID是4位数字:

grep -oE "AAA[0-9]{4}BBB" <filename> | grep -oE "[0-9]{4}"
grep-oE“AAA[0-9]{4}BBB”| grep-oE“[0-9]{4}”
编辑:

如果你有类似于“AAA12@3BBB“:

grep-oE“AAA.{4}BBB”| grep-oE“[0-9,@]{4}”

如果我有一个包含AAAZ1@6BBB然后将
\d+
更改为
+?
并且,使用
grep-o-P模式
仅发出matches@PeterS使用
*?
代替
\d+
 grep -oE "AAA.{4}BBB" <filename> | grep -oE "[0-9,@]{4}"