我有一个很长的文件,其中包含文件路径,每行一个。我想检索列出的所有目录的列表,这些目录只有 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