Bash 複合部分文字列の拡張

Bash 複合部分文字列の拡張

awk複数の区切り文字を解析するために使用できることはわかっていますが、これにより子プロセスが作成されます。複合/ネストされたbashパラメータの拡張が可能かどうか疑問に思います。

私のPDFファイルは「Px_MM-DD-YY_SSSSSSSSSS.pdf」というディレクトリにあります。

  • 「Px」は「ページx」を意味し、xには前に0がない。
  • 「MM」は2桁の月に対応し、該当する場合は前にゼロが付きます。
  • 「DD」は2桁の日付に対応し、該当する場合は先頭に0が付きます。
  • 「YY」は2桁の年に対応し、該当する場合は先頭に0が付きます。
  • 「SSSSSSSSSS」は、PDFが生成された10桁の新起源時間に対応するため、PDFページの改訂版を保存できます。

forループがあります(すべてのPDFで作業する準備ができたら、「-mtime」を削除します)。

for file in $(find -type f -iname '*_??????????.pdf' -mtime -1)
do
    echo $file
done

私は時代の時間を反映したいだけです。

これをループに使用できます

for file in $(find -type f -iname '*_??????????.pdf' -mtime -1)
do
    echo ${file##*_}
done

「./P14_07-21-18_4X_1532144458.pdf」というファイルの場合、「1532144458.pdf」が画面に表示されます。

これをループに使用できます

for file in $(find -type f -iname '*_??????????.pdf' -mtime -1)
do
    echo ${file%.*}
done

「./P14_07-21-18_4X_1532144458.pdf」というファイルの場合、「./P14_07-21-18_4X_1532144458」が画面に表示されます。

echo ...行を以下の形式のいずれかに置き換えると

echo ${${file##*_}:0:10}
echo ${(${file##*_}):0:10}
echo ${${file##*_}%.*}
echo ${{file%.*}##_}
echo ${${file%.*}##_}

わかりました-bash: ... : bad substitution。私の構文は正しいですか、それともネスト/複合bash拡張は不可能ですか?

ベストアンサー1

入れ子になった置換を実行できません。変数は一番左の部分にあります。。だからあなたはそれを行うことができますが、${foo#$bar}あなたが示すものではありません。

代替結果を追加の置換に使用するには、代替結果を変数に入れます。

おすすめ記事