정규식을 사용하여 폴더에 있는 모든 파일의 파일 이름을 일치시키고 접미사를 추출하려고 합니다. 그러나 이러한 패턴을 가진 파일이 있음에도 불구하고 어떤 이유로 정규식은 폴더의 어떤 파일과도 일치하지 않는 것 같습니다.
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_e
두 check 1
가지 제안 중 하나를 호출하면 해당 문에 도달합니다 :
. 이를 다음으로 바꿔서 확인할 수 있습니다.echo "Found $file"
마지막으로, 귀하의 질문에서 RE 비교를 사용하여 일치의 마지막 부분을 추출했다고 언급했으므로 다음을 얻을 수도 있습니다.
# Assume $file is valid
tail="${file##*/c."$1".}"
echo "Last part of the path is $tail"