PDFファイルが複数あり、すべて「READING nn」という文字列が含まれています。ここで、nnはその読み取り値の番号です。各文字の間には「READING 1 0」というスペースが 1 つあります。
各ファイルから数字nを検索し、その数字をファイルの先頭に追加するbashスクリプトを作成したいと思います。たとえば、スクリプトがname.pdfで「READING 1」を見つけた場合は、ファイル名を1.name.pdfなどに変更する必要があります。
どうすればいいですか?
ありがとう
ベストアンサー1
あなたの質問に対する答えは、この文字列が発生する可能性があるかどうかによって異なります。一度または検討中のPDFファイル内で何度も。一度だけ起こることができると仮定すると、そして問題の文字列は実際のテキスト(つまりグラフィック形式ではない)として含まれており、次のアプローチ(GNU Awkと外部ツールが必要ですpdftotext
)が機能するはずです(例は引数として渡された単一のファイルに対して機能します)。
#!/bin/bash
OLDNAME="$1"
NUMBER="$(pdftotext "$OLDNAME" - | awk '/R E A D I N G/ {match($0,"R E A D I N G ([[:digit:]])( [[:digit:]])*",a); gsub(" ","",a[2]); print a[1] a[2];}')"
NEWNAME="$NUMBER.$OLDNAME"
mv "$OLDNAME" "$NEWNAME"
match
特定のパターンが存在することを確認しawk
、そのパターンの「実際の値」を出力配列に出力します。a
ここで、エントリには、a[0]
見つかったパターン全体が含まれ、パターン内の括弧で囲まれたサブ式の「実際の値」がa[1]
含まれます。a[n]
私たちの場合、配列項目1と2の「数字部分」です([[:digit:]])( [[:digit:]])*
(例:GNU Awkユーザーガイドの「文字列関数」セクション)。結果が1桁の場合は空にしてa[2]
も構いません。 2桁の数字の場合、数字の間のスペースも一致するため、2桁の数字の場合はawk
s関数を使用してそれらを削除します。gsub()
複数のファイルに適用するには、次のようにスクリプトを変更し、PDFファイルの完全なリストをパラメータ(たとえば./rename.sh *.pdf
)に渡します。
#!/bin/bash
for OLDNAME in "$@"
do
NUMBER="$(pdftotext "$OLDNAME" - | awk '/R E A D I N G/ {match($0,"R E A D I N G ([[:digit:]])( [[:digit:]])*",a); gsub(" ","",a[2]); print a[1] a[2];}')"
NEWNAME="$NUMBER.$OLDNAME"
mv "$OLDNAME" "$NEWNAME"
done