【问题标题】:Grep everything between two special character patternsgrep 两个特殊字符模式之间的所有内容
【发布时间】:2014-05-07 04:41:58
【问题描述】:

我无法弄清楚如何 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)

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

【问题讨论】:

  • 哪种编程语言?

标签: regex grep


【解决方案1】:

这是一个适用于 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】:

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

    【讨论】:

    • grep 也很容易! ;)
    • grep 的好答案:)
    • 漂亮整洁,比 grep 更简单的语法 - 谢谢!
    【解决方案3】:

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

    【讨论】:

    • 但是@Lel 需要spcaac(3)-Ik 作为结果(即没有包围'__')
    • 这就是我一直在寻找的,所以感谢您的回复。但是是的,我需要使用 sed 删除下划线。你能解释一下 [^_] 的用法来定义“介于两者之间”吗?以及这种方法如何确定是在下划线之间使用第一个模式还是第二个模式?再次感谢
    • [^_]* 表示匹配任何非下划线。对于grep -o,它将仅匹配第一个匹配项。您可以使用-P 开关进行扩展,该开关将匹配一行中的所有此类条目。使用-P 开关,您还可以删除下划线。
    猜你喜欢
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 2022-09-22
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多