![正则表达式捕获具有特定结构的文件夹名称](https://linux22.com/image/126148/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%8D%95%E8%8E%B7%E5%85%B7%E6%9C%89%E7%89%B9%E5%AE%9A%E7%BB%93%E6%9E%84%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B9%E5%90%8D%E7%A7%B0.png)
使用此结构捕获文件夹名称的正则表达式是什么
xxxx-x(x - 整数)
ls /usr/hdp | .....
2.6.0.3-8 current HG_MASTER 2.4.3 34.1 45-995
预期产出
2.6.0.3-8
ls -lh /usr/hdp/
total 8.0K
drwxr-xr-x. 27 root root 4.0K Jan 1 15:24 2.6.0.3-8
答案1
自从你标记了巴什,您实际上可以使用扩展的 globs 通过 shell 的文件名匹配来做到这一点:
$ shopt -s extglob
$ touch /some/path/{2.6.0.3-8,22.66.0.333-8,foobar}
$ printf "%s\n" /some/path/+([0-9]).+([0-9]).+([0-9]).+([0-9])-+([0-9])
/some/path/22.66.0.333-8
/some/path/2.6.0.3-8
那里的模式的工作方式类似于更常见的东西,例如*
或*.png
,因此您可以将固定部分(例如路径)粘贴到其中。添加尾部斜杠/
以仅匹配目录。 (不过,斜杠也出现在输出中。)
在 ERE 正则表达式中,模式与 相同[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+-[0-9]+
。模糊版本只会检查允许的字符,例如+([-.0-9])
(或[-.0-9]+
ERE 中的),但当然也会匹配例如123..456
。
如果您只想打印文件名,find
可能会更容易,但如果您想对它们运行命令,那么 shell 循环也是一个选项(与 一起find -exec
)。
答案2
find . -type d -regextype posix-egrep -regex '^./([0-9]+[.]){3}[0-9]+[-][0-9]+'
使用 find 然后使用 regextype 标志将 reg 表达式语法设置为egrep。使用 -regex 检查 3 个数字和一个“点”,然后检查一个数字、“破折号”和一个数字。
如果数字超过一个字符,则每个数字后需要加 +。
答案3
你需要用它find
来代替。对于精确匹配使用模式:
find /usr/hdp -regextype sed -regex "\/usr\/hdp\/[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*-[0-9]*"
如果您需要任何仅包含以下内容的文件数字,.
并且-
名称中的符号尝试:
find /usr/hdp -regextype sed -regex "\/usr\/hdp\/[.0-9-]*"
答案4
ls /usr/hdp | egrep '[0-9]+.[0-9]+.[0-9]+.[0-9]+-[0-9]+'