如何使用grep精确匹配包含斜杆的字符串?

3

我正在使用macOS。

以下是需要查询的字符串:

/superman

/superman1

/superman/batman

/superman2/batman

/superman/wonderwoman

/superman3/wonderwoman

/batman/superman

/batman/superman1

/wonderwoman/superman

/wonderwoman/superman2

我希望只提取加粗字体的单词。

我尝试使用grep -wr 'superman/|/superman'来查找它们,但只能得到 /superman 一个结果。

你有什么好的建议吗?

2个回答

2
最初的回答。您可以使用


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

查看在线演示

最初的回答:

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 - 一个单词
  • ($|/) - 字符串结尾或斜杠。

"Original Answer"的翻译是"最初的回答"。


0
grep '/superman\>'

\> 是“单词结束标记”,对于“superman3”而言,单词的结束并不是跟在“man”后面


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

  1. |基本正则表达式中不是特殊字符。您需要转义它或使用grep -E
  2. 请阅读有关-w如何工作的手册:

    测试是匹配的子字符串必须位于行的开头,或者前面是非单词成分字符。同样,它必须位于行的末尾或后面跟随一个非单词成分字符

    在行为/batman/superman的情况下,

    • 模式superman/不存在
    • 模式/superman
      • 在行的末尾,这是可以的,但是
      • 前面是字符“n”,它是一个单词成分字符

grep -w superman 会给你更好的结果,或者如果你需要在斜杠前面加上superman,那么我的原始答案也可以。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接