匹配所有仅包含一个 '/' 字符的字符串

匹配所有仅包含一个 '/' 字符的字符串

我有一个很长的文件,其中包含文件路径,每行一个。我想检索列出的所有目录的列表,这些目录只有 1 级深度。因此,我只想提取其中只有一个的行/

我想要:./somedir
我不想要:./somedir/someotherdir

我可以用 grep 和/或正则表达式来做到这一点吗?

答案1

当然。这很简单:

find . | grep -P '^\./[^/]*$'

... 显然,我使用“find”命令只是为了说明您所描述的内容。正则表达式的工作原理如下:

  • ^$是分别指定行首和行末的锚点。所有内容必须位于这两个字符之间
  • \./是一个文字句点,后跟一个文字正斜杠
  • [^]是一个字符类,禁止^]
  • 后面*[^/]表示允许该字符类出现零次或多次

你也可以这样做:

dosomething | grep -P '^[^/]*/[^/]*$'

/这将只允许一行上出现一个字符,位于行上的任何位置(甚至是第一个或最后一个字符)。

答案2

@Brians 解决方案有效,这是一个更通用的解决方案,不需要./在开头:

grep -P '^[^/]*/[^/]*$'

例如:

/aa/somedir
test/somedir/someotherdir
somedir/otherdir

--> somedir/otherdir

相关内容