正则表达式获取除当前词典和父词典之外的点文件

标签 regex linux grep

我正在读《Linux 工作原理》一书。 作者给出了以下正则表达式,以便我可以获得除当前目录和父目录之外的所有点文件。 (第21页)

.??*
.[^.]*

如果目录中存在任何点文件,则两者都可以工作。但是,当不存在点文件时,只有第一个文件起作用。

我无法理解他们。你能描述一下我吗?

$ ls -a
. .. .hiding something

$ ls -a | grep .??*
.hiding

$ ls -a | grep .[^.]*
.hiding

$ mv .hiding hiding

$ ls -a | grep .??*

$ ls -a | grep .[^.]*
.
..
hiding
something

最佳答案

第一个并没有真正意义,对我不起作用,而且我也找不到任何关于 ?? 的文档。

无论如何,这两个正则表达式都存在两个问题:

  1. 这里的.匹配任何字符。为了仅匹配单个点,您必须在其前面放置一个 \,例如 \.

  2. 整个表达式可以匹配行中的任何位置。您必须断言匹配从头开始。所以从 ^ 开始。

尝试:ls -a | grep '^\.[^.]' 这意味着:从行的开头开始,找到一个点。然后是方括号之间未列出的任何字符(此处由第二个 ^ 完成否定),因此不是文字点。

在括号中,您不必使用 \,尽管可以。

关于正则表达式获取除当前词典和父词典之外的点文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32196775/

相关文章:

linux - Snort 消息-警告 : No preprocessors configured for policy 0

c - 如何在 fork 之后或子进程中创建共享内存?

python - 使用 python 将一个文件中的行从另一个文件中提取出来

grep - 查找以 "+"结尾的行

Javascript用其他文本替换字符串中的文本

c# - Visual Studio 搜索和替换行尾

c# - 双引号中的 SpecFlow C# Regex 可选参数

javascript - 将 RegEx 传递给 Javascript 中的函数

linux - 在 Linux 中设置默认的 ping 截止时间

linux - 如何根据 linux 中的相邻列值获取列值?