정규 표현식은 파일 이름과 일치할 수 없습니다.

정규 표현식은 파일 이름과 일치할 수 없습니다.

정규식을 사용하여 폴더에 있는 모든 파일의 파일 이름을 일치시키고 접미사를 추출하려고 합니다. 그러나 이러한 패턴을 가진 파일이 있음에도 불구하고 어떤 이유로 정규식은 폴더의 어떤 파일과도 일치하지 않는 것 같습니다.

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_echeck 1가지 제안 중 하나를 호출하면 해당 문에 도달합니다 :. 이를 다음으로 바꿔서 확인할 수 있습니다.echo "Found $file"

마지막으로, 귀하의 질문에서 RE 비교를 사용하여 일치의 마지막 부분을 추출했다고 언급했으므로 다음을 얻을 수도 있습니다.

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

관련 정보