正規表現を使用して、フォルダ内のすべてのファイルのファイル名を一致させ、サフィックスを抽出しようとします。しかし、これらのパターンを持つファイルがあるにもかかわらず、何らかの理由で正規表現はフォルダ内のどのファイルとも一致しないようです。
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
2check 1
つの提案のうちの1つを呼び出すとその文に到達します:
。これを次のように変更して確認できます。echo "Found $file"
最後に、あなたの質問でRE比較を使用して一致の最後の部分を抽出したと述べたので、次のようにすることもできます。
# Assume $file is valid
tail="${file##*/c."$1".}"
echo "Last part of the path is $tail"