祖父母文件夹名称的正则表达式

祖父母文件夹名称的正则表达式

我有一个像这样的路径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

测试于:https://rextester.com/l/bash_online_compiler

答案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

相关内容