搜索两个特殊字符模式之间的所有内容



我有麻烦弄清楚如何grep两个特殊字符模式之间的字符。具体来说,我需要搜索第一个__(双下划线)和第二个__之间的所有内容,我可以使用sed将它们转换为空格,然后剪掉列,但这似乎有点不必要和混乱。

我的数据看起来像这样....

364__spc__spc__1334
608__aac(3)-Ik__aac(3)-Ik__1927
13__tet(S)__tet(S)_1__1102
我需要的结果是……
spc
aac(3)-Ik
tet(S)

提前感谢任何有建议的人。

使用awk可以很容易地做到这一点

awk -F'__' '{print $2}' filename

$ cat filename
364__spc__spc__1334
608__aac(3)-Ik__aac(3)-Ik__1927
13__tet(S)__tet(S)_1__1102
$ awk -F'__' '{print $2}' filename
spc
aac(3)-Ik
tet(S)

下面是Java的工作解决方案:

String s = "608__aac(3)-Ik__aac(3)-Ik__1927".replaceAll(".*?__(.*?)__.*", "$1");

PS:如果你想用这个正则表达式匹配多个字符串,考虑创建一个Pattern的实例(正则表达式编译一次,使用多次)。

另一个使用sed:

echo "608__aac(3)-Ik__aac(3)-Ik__1927" | sed 's/.*?__(.*?)__.*/1/g'

grep 对此有一个选项。从手册页:

- o, only-matching只打印行中匹配的部分。

$ cat file
364__spc__spc__1334
608__aac(3)-Ik__aac(3)-Ik__1927
13__tet(S)__tet(S)_1__1102

$ grep -o '__[^_]*__' file
__spc__
__aac(3)-Ik__
__tet(S)__

最新更新