我无法弄清楚如何在两个特殊字符模式之间使用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)
提前感谢任何有建议的人。
答案 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)__