【问题标题】: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\>'
\>是“词尾标记”,对于“superman3”,词尾不在“man”之后
您的-w 解决方案存在的问题:
-
| 在 basic 正则表达式中不是特殊的。您要么需要转义它,要么使用grep -E
-
阅读有关 -w 工作原理的手册页:
测试是
匹配的子字符串必须在行首,或者 前面有一个非单词
组成字符。同样,它必须位于行尾或后跟
非单词组成字符
如果该行是/batman/superman,
- 模式
superman/没有出现
- 模式
/superman 是:
- 在行尾,没关系,但是
- 前面有字符“n”,是一个单词组成字符。
grep -w superman 会给你更好的结果,或者如果你需要在超人前面加上一个斜线,那么我原来的答案就可以了。