小文字と大文字の拡張をパラメータ拡張に置き換える方法は?

小文字と大文字の拡張をパラメータ拡張に置き換える方法は?

docLinuxでtxt使用するためにファイルを変換していますcatdoc。出力ファイルと同じファイル名を保持するために、.doc拡張子をパラメータ拡張子に置き換えます。ただし、ファイル名自体に大文字を保ちながら大文字と小文字を区別しないようにする方法は.txtたくさんあります。一部のファイルのファイル名にドットが含まれているため使用できません。.DOC.doc${filename%.doc}.txt${filename%.*}.txt

私の現在のコード:

find "${COMPANYPATH}" -iname '*.doc' | while read -r file; do
    echo "${file}"
    filename=$(basename "${file}")
    path="${file%/*}/"
    mkdir -p "${OUTPUTPATH}/DOC/${path#$COMPANYPATH/}"
    catdoc "${file}" >> "${OUTPUTPATH}/DOC/${path#$COMPANYPATH}${filename%.doc}.txt"
done

入力する

/home/user/test/2218-0/test.doc
/home/user/test/2218-0/Test2.DOC

期待される出力

/home/user/output/test/DOC/2218-0/test.txt
/home/user/output/test/DOC/2218-0/Test2.txt

重複したファイルはありません。

ベストアンサー1

Bashでは、パターンマッチングで${filename%.doc}大文字と小文字を区別できないと思います。zshでできます。、with ${filename%(#i).doc}setopt extendedglob有効にする必要があります)またはksh93.Bash${filename%~(i:.doc)}nocasematch役に立たず、単に動作してcaseビルド[[ .. ]]されます。

すべてのPOSIXシェルには、常に大文字と小文字の明示的なリストを使用する回避策があります${filename%.[dD][oO][cC]}。または、最後の3文字を削除すると、${filename%.???}正しいfind文字のみが提供されます。

その後、再び${filename%.*}最も短い一致部分のみを削除する必要があるため、問題はありません。 (%%最長は削除されます。)

ジシュ語:

% setopt extendedglob
% filename=foo.bar.DoC
% echo ${filename%.(#i)doc}.txt
foo.bar.txt

シェル/スラム:

$ filename=foo.bar.DoC
$ echo "${filename%.[dD][oO][cC]}.txt"
foo.bar.txt
$ echo "${filename%.*}.txt"
foo.bar.txt

おすすめ記事