我试图在目录中的所有文件中搜索与任意目录模式匹配的文本。我希望使用此输出来列出文件中引用的所有目录(这部分我想我可以自己弄清楚)。
我查看了各种正则表达式资源,并制作了我自己的表达式,它似乎可以在基于浏览器的工具中使用,但不能在命令行中的 grep 中使用。
/\w+[(/\w+)]+
到目前为止,我的理解是,上述表达式将查找目录的开头 /,然后查找不确定数量的字符,然后查找相同内容的重复块。
任何指导都将不胜感激。
答案1
如果我理解正确的话,您需要一个可用于grep
识别路径的正则表达式。我不确定您要用您发布的正则表达式做什么。为什么您要重复某些内容?路径只需要一个斜杠:/etc
。
无论如何,如果您想要任何类型的路径(路径也可以包含非单词字符,如,,{
空格和换行符等),请尝试以下操作:[
(
grep -E '/[^/]+' *txt
_____
| |--------> one or more
|-----------> A character class, '^' in a character class means NOT,
so this class means "anything that is not /".
这-E
表明grep
你给它的模式应该被解释为扩展正则表达式而不是其默认的“基本正则表达式”。ERE 支持+
“一个或多个”,这对于查找第一个斜杠后至少有一个非斜杠字符的字符串是必需的。
如果你只想找到包含多个路径的路径/
,你可以这样做
grep -E '/[^/]+/[^/]+' *txt
路径也可以以斜杠结尾,如果出于某种原因您想要保留这样的尾随斜杠,请使用 (/?
表示“查找零个或一个/
”):
grep -E '/[^/]+/[^/]+/?' *txt
更具体地说,您使用的正则表达式因各种原因而失败。首先,正如@erewok指出的那样,您使用了括号和+
括号内的a。由于括号指定了字符类,其中的任何内容都被视为要找到的字符之一(例外情况是^
使其成为否定字符类)。
因此,[(/\w+)]+
表示找到(
、/
、任何单词字符 ( \w
)+
或中的任意)
一个一次或多次。在任何情况下,除非您使用\w
grep
Perl 兼容正则表达式。您可以grep
使用-P
标志激活它们。例如,这将匹配如下路径/etc
:
grep -P '/\w+' *txt
如果你知道您的路径将始终由单词字符组成(即 az、AZ、0-9 和_
),您可以使用类似上面的表达式,但由于人们永远无法确定,因此使用不太严格的表达式,例如我的第一个建议是更好的选择。