正規表現はファイル名と一致できません。

正規表現はファイル名と一致できません。

正規表現を使用して、フォルダ内のすべてのファイルのファイル名を一致させ、サフィックスを抽出しようとします。しかし、これらのパターンを持つファイルがあるにもかかわらず、何らかの理由で正規表現はフォルダ内のどのファイルとも一致しないようです。

check() {
    x=$1
    regex="\/tmp\/a\/b\/c\.${x}\.(.+?)"
    while IFS= read -r -d '' file; do
            if [[ "$file" =~ $regex ]]; then
                # do something
            fi
    done < <(find /tmp/a/b -type f -name "c.${x}.*" -print0)
}

私は何を逃したことがありませんか?

ありがとうございます!

説明#1:使用はfind不要です。

説明#2:$x下線を除く特殊文字はありません。

説明#3:(.+?)抽出して後で渡そうとするのでこれを使っています。$BASH_REMATCH[1]

私のファイル:

$ ll /tmp/a/b/
total 0
-rw-rw-r-- 1 hc hc 0 Jun 20 15:40 list

ベストアンサー1

ディレクトリツリーではなく特定のディレクトリを確認したいと述べましたが、質問に提供されたREはこの要件をサポートしていません。

この場合、完全に放棄することもできますfind。ここで、globパターンは基本的にRE ^/tmp/a/b/c\.$x\.([^/]+?)$(RE特殊文字を除く$x)と同じですが、これは制限されていないREとまったく同じではありません/tmp/a/b/c.$x\.(.+?)

あなたのREの意図を誤解した場合は、質問を明確にしてください。ここでもう一度説明します。

check() {
    local file
    for file in /tmp/a/b/c."$1".?*
    do
        if [[ -f "$file" ]]
        then
            # do something
            :
        fi
    done
}

必ず使用する必要がある場合は、findこれを試してください。

check() {
    find /tmp/a/b -type f -name "c.$1.?*" -print0 |
        while IFS= read -r -d '' file
        do
            # do something
            :
        done
}

fileの場合、/tmp/a/b/c.1.d_e2check 1つの提案のうちの1つを呼び出すとその文に到達します:。これを次のように変更して確認できます。echo "Found $file"

最後に、あなたの質問でRE比較を使用して一致の最後の部分を抽出したと述べたので、次のようにすることもできます。

# Assume $file is valid
tail="${file##*/c."$1".}"
echo "Last part of the path is $tail"

おすすめ記事