【问题标题】:How to grep an exact string with slash in it?如何grep一个带有斜杠的精确字符串?
【发布时间】:2019-11-03 10:13:12
【问题描述】:

我正在运行 macOS。

有以下字符串:

/超人

/超人1

/超人/蝙蝠侠

/superman2/蝙蝠侠

/超人/神奇女侠

/superman3/wonderwoman

/蝙蝠侠/超人

/蝙蝠侠/超人1

/神奇女侠/超人

/wonderwoman/superman2

我只想grep粗体字。

我认为执行 grep -wr 'superman/|/superman' 会产生所有这些,但它只会产生 /superman。

知道该怎么做吗?

【问题讨论】:

    标签: regex macos command-line grep


    【解决方案1】:

    你可以使用

    grep -E '(^|/)superman($|/)' file
    

    online demo

    s="/superman
    /superman1
    /superman/batman
    /superman2/batman
    /superman/wonderwoman
    /superman3/wonderwoman
    /batman/superman
    /batman/superman1
    /wonderwoman/superman
    /wonderwoman/superman2"
    grep -E '(^|/)superman($|/)' <<< "$s"
    

    输出:

    /superman
    /superman/batman
    /superman/wonderwoman
    /batman/superman
    /wonderwoman/superman
    

    模式匹配

    • (^|/) - 字符串或斜线的开头
    • superman - 一句话
    • ($|/) - 字符串结尾或斜线。

    【讨论】:

      【解决方案2】:
      grep '/superman\>'
      

      \&gt;是“词尾标记”,对于“superman3”,词尾在“man”之后


      您的-w 解决方案存在的问题:

      1. |basic 正则表达式中不是特殊的。您要么需要转义它,要么使用grep -E
      2. 阅读有关 -w 工作原理的手册页:

        测试是 匹配的子字符串必须在行首,或者 前面有一个非单词 组成字符。同样,它必须位于行尾或后跟 非单词组成字符

        如果该行是/batman/superman

        • 模式superman/没有出现
        • 模式/superman 是:
          • 在行尾,没关系,但是
          • 前面有字符“n”,一个单词组成字符。

      grep -w superman 会给你更好的结果,或者如果你需要在超人前面加上一个斜线,那么我原来的答案就可以了。

      【讨论】:

        猜你喜欢
        • 2012-06-29
        • 1970-01-01
        • 1970-01-01
        • 2013-11-12
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 2023-03-11
        • 2011-06-13
        相关资源
        最近更新 更多