regex - Linux find 命令:搜索包含括号的文件名
问题描述
我需要找到文件名如下的文件:
<some regex-matched text> (1).<some regex-matched text>
即我想搜索包含的文件名
- 以空格结尾的文本
- 然后是一个左括号(括号)
- 后跟数字 1
- 后跟一个右括号
- 可能后跟一个点,然后是更多文本...
我先去了 find . -regex '.* \(1\)\..*'
。但是括号被忽略了:.* 1\..*
返回匹配的文件。
在我试图找到答案的过程中,我发现这个页面涵盖了 Linux find
。在这里,我找到了这句话:
“使用反斜杠后跟括号 '\(', '\)' 进行分组。”
【注:给读者看单反斜杠,如那页所示,我把反斜杠加倍写成上面的单反斜杠!】
我不知道该怎么做,即在这种情况下如何转义普通括号。我想也许将表达式中的反斜杠加倍find
可能会起作用,但事实并非如此。
即使我尝试在不使用正则表达式的情况下执行此操作find
,该位置的括号和/或点似乎也存在一些问题:
mike@M17A .../accounts $ find . -name *(1).pdf
[... finds stuff OK]
mike@M17A .../accounts $ find . -name *(1).*
find: paths must precede expression: ..
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec|time] [path...] [expression]
mike@M17A .../accounts $ find . -name *(1)\.*
find: paths must precede expression: ..
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec|time] [path...] [expression]
NB 在这些尝试中在初始 * 之后放置一个空格也失败了......
解决方案
那是因为您不需要转义这些括号。这应该工作:
find . -regex '.* (1)\(\..*\)?'
尽管使用了捕获组(转义括号)\(\..*\)
,但我们可以使最后一个匹配项成为可选的(可能后跟一个点,后跟更多文本)?
推荐阅读
- spring - 如何使用数据源手动初始化数据库?
- python - 应用 sklearn.compose.ColumnTransformer 后保留列顺序
- windows - 如何在 Windows UWP 应用中捕获桌面屏幕图像?
- macos - 如何防止 Picker 在 SwiftUI macOS 中折叠到子菜单中
- solr - Solr - 搜索建议
- vue.js - Nuxt:Vuex 从按钮单击更新数据不起作用。错误“无法读取未定义的属性‘结果’”
- rust - 在 Rust 中将 u64 乘以 u128 时出错?
- python - Sudoku Solver 在 Python 中提供部分解决方案:为什么?
- android - 如何将我的自定义视图迁移到 Jetpack Compose?
- c++ - 派生类中的私有函数被基类指针调用