搜索文件以查找与 Unix 目录格式匹配的文本

搜索文件以查找与 Unix 目录格式匹配的文本

我试图在目录中的所有文件中搜索与任意目录模式匹配的文本。我希望使用此输出来列出文件中引用的所有目录(这部分我想我可以自己弄清楚)。

我查看了各种正则表达式资源,并制作了我自己的表达式,它似乎可以在基于浏览器的工具中使用,但不能在命令行中的 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)+或中的任意)一个一次或多次。在任何情况下,除非您使用\wgrepPerl 兼容正则表达式。您可以grep使用-P标志激活它们。例如,这将匹配如下路径/etc

grep -P '/\w+' *txt

如果你知道您的路径将始终由单词字符组成(即 az、AZ、0-9 和_),您可以使用类似上面的表达式,但由于人们永远无法确定,因此使用不太严格的表达式,例如我的第一个建议是更好的选择。

相关内容