我有一个像这样的路径C:\Users\Administrator\Desktop\Photos-or\3-PRO\3-1-CR\CR-RESTS\LES-COQS\1920x500
,我想要一个正则表达式来匹配祖父母文件夹,在本例中为LES-COQS
.
我试过了:
echo "C:\Users\Administrator\Desktop\Photos-or\3-PRO\3-1-CR\CR-RESTS\LES-COQS\1920x500" | grep -i "[a-zA-Z0-9-]*\\\[0-9a-z]*$"
我应该使用前瞻/后瞻吗?或者有更简单的方法吗?
谢谢
答案1
假设您想要输出该 MS-DOS 样式路径的倒数第二个部分,您可以这样做:
msdos_path='C:\Users\Administrator\Desktop\Photos-or\3-PRO\3-1-CR\CR-RESTS\LES-COQS\1920x500'
expr "\\$msdos_path" : '.*\\\(.*\)\\.*'
这里会输出LES-COQS
.
答案2
有多种方法可以从路径中提取倒数第二项。以下是一些混合解决方案的方法
p='C:\Users\Administrator\Desktop\Photos-or\3-PRO\3-1-CR\CR-RESTS\LES-COQS\1920x500'
echo "$p" | grep -oP '.*\\\K[^\\]*(?=\\[^\\]+)' # PCRE
echo "$p" | sed 's!^.*\\\([^\\]*\)\\[^\\]*$!\1!' # RE
echo "$p" | awk -F'\\' '{print $(NF-1)}' # Awk
IFS='\\' ps=($p); echo "${ps[-2]}" # Shell (bash)
px="${p%\\*}"; echo "${px##*\\}" # Shell
由于 Windows 文件夹路径中的每个反斜杠必须与每个 RE 模式中的双反斜杠相匹配,因此表达式更难阅读。 (事实上,我通过将 替换\
为 来完成其中的一些工作/
。)
答案3
也许这会帮助您获得预期的结果
#!/bin/bash
# GNU bash, version 4.4.20
echo "C:\Users\Administrator\Desktop\Photos-or\3-PRO\3-1-CR\CR-RESTS\LES-COQS\1920x500" | rev | awk -F'\' '{ print $2 }' | rev
输出 :
LES-COQS
答案4
您可以将 sed 与扩展正则表达式和替换命令一起使用:
$ echo "C:\Users\Administrator\Desktop\Photos-or\3-PRO\3-1-CR\CR-RESTS\LES-COQS\1920x500" | sed -E 's/(.*\\)([^\\]+)(\\[^\\]+)/\2/'
LES-COQS