获取号码
您可以通过sed获取最后一个号码:
sed 's/.*(\([0-9]*\))$/\1/' <<< "asdf%k123 test1 (12345)"
12345
sed 脚本是这样写的:
- 开头
s 表示执行替换,使用以下语法s/pattern/replacement/
-
/ 字符定义了替换的分隔符,您可以使用任何字符,但 / 是一个非常常见的字符
-
.*(\([0-9]*\))$ 是模式(我稍后会回复)
-
\1 是替换,在这种情况下它替换模式捕获的第一个字符串,即数字(见下文)
关键元素是模式。在这种情况下,.*(\([0-9]*\))$ 可以拆分为:
-
.* 匹配任意字符任意次数
-
( 匹配左大括号字符
-
\([0-9]*\) 捕获任何由数字组成的字符串,也就是数字
-
) 匹配右大括号字符
-
$ 匹配行尾
在捕获模式中,即(\([0-9]*\),需要注意\(和\)是捕获的分隔符,不要误认为(和)是正则括号字符。
TL;DR:此模式表示“我想在行尾之前捕获一个用括号括起来的数字”。 sed 脚本说“我想只打印捕获的号码”。
列出目录
您可以使用find 解析目录。如果您只想要一级子文件夹:
find /path/to/dir -mindepth 1 -maxdepth 1 -type d
-mindepth 1 -maxdepth 1 选项可确保您仅获得 1 深度的子级,而 -type d 选项仅列出目录(不列出文件,不列出符号链接等)。
您可以通过将-maxdepth 1 替换为您选择的数字来获得更多深度,或者干脆省略此选项以递归方式获取所有子文件夹。
由于您的目录似乎包含各种特殊字符,我还建议使用 -print0 选项获取它们,该选项将结果与空字符 \0 分隔,而不是换行符。
解决方案
总而言之,它看起来像这样:
find /path/to/dir -mindepth 1 -maxdepth 1 -type d -print0 |
while IFS= read -r -d '' dirname
do
sed 's/.*(\([0-9]*\))$/\1/' <<< $dirname
done
如果您想过滤掉与您的模式不匹配的目录,您可以将 sed 更改为使用-n 选项,然后使用p 命令打印:
find /path/to/dir -mindepth 1 -maxdepth 1 -type d -print0 |
while IFS= read -r -d '' dirname
do
sed -n 's/.*(\([0-9]*\))$/\1/p' <<< $dirname
done