親フォルダ名の正規表現

親フォルダ名の正規表現

私はこのようなパスを持っており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スタイルパスの最後から2番目の部分を出力したいと仮定すると、次のようにできます。

msdos_path='C:\Users\Administrator\Desktop\Photos-or\3-PRO\3-1-CR\CR-RESTS\LES-COQS\1920x500'
expr "\\$msdos_path" : '.*\\\(.*\)\\.*'

ここに出力されますLES-COQS

答え2

パスから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

関連情報