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

时间:2014-03-27 22:32:59

标签: regex grep

我无法弄清楚如何在两个特殊字符模式之间使用grep字符。 具体来说,我需要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)

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

3 个答案:

答案 0 :(得分:1)

您可以使用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)

答案 1 :(得分:0)

以下是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'

答案 2 :(得分:0)

grep 有此选项。从手册页:

  

-o, - 仅匹配                仅打印行的匹配部分。

$ 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)__