4

私はフォーラムとstackoverflowでこれを探してきました。ここのどこかにあるはずなのですが、見つかりませんでした。
私は Mac を使用しており、ターミナルを使用してシェル スクリプトを実行し、ファイルの内容に基づいて一部の pdf ファイルの名前を変更しています。

オープンソースのpdfboxを使用してテキストファイルにエクスポートしているpdfでいっぱいのディレクトリがあります。結果のファイルは、pdf ファイルと同じ名前になりますが、末尾が.txt. テキスト ファイルを作成して、ファイル内の文字列を次の形式で検索できるようにしましたPage xx Question xx。たとえばPage 43 Question 2。この例を考えると、pdfファイルの名前を次のように変更したいと思いますpg43_q2.pdf

必要な正規表現は次のとおりだと思いますが /Page\s+(\d+)Question\s+(\d+) 、キャプチャした 2 つの数値を読み取り、ファイル名として使用できる文字列に保存する方法がわかりません。

私がこれまでに持っているスクリプトは次のとおりです。

#!/bin/sh
PDF_FILE_PATH=$1
echo "Converting pdfs at $PDF_FILE_PATH"

find "$PDF_FILE_PATH" -name '*.pdf' -print0 | while IFS= read -r -d '' filename; do
   echo $filename
   java -jar pdfbox-app-1.6.0.jar ExtractText "$filename" "$filename.txt"
   NEWNAME=$(sed -n -e '/Page/s/Page\s+\(\d+\)\s+Question\s+\(\d+\).*$/pg\1_q\2/p' "$filename.txt")
   echo "Renaming pdf $filename to $NEWNAME"
   # I would do this next but the $NEWNAME is empty
   # mv "filename" "PDF_FILE_PATH$NEWNAME"
done

...しかし、sedコマンドはNEWNAME変数に何も入れていません。

私は特にsedに執着していません。何か提案をいただければ幸いです

スクリプトの最新の編集では、次の sed コマンドを使用します。

newname=$(sed -nE -e '/Page/s/^.*Page[[:blank:]]+([0-9]+)[[:blank:]]+Question[[:blank:]]+([0-9]+).*$/pg\1_q\2.pdf/p' "$filename.txt")

これは約 50% の場合に機能しますが、ファイルの名前を変更しようとすると、残りの時間は newname 変数が空になります。

機能する変換済みファイルの 3 行目:

Unit 2 Review Page 257 Question 9  a)  12 (2)(2)(3)

動作しない変換済みファイルの 3 行目:

Unit 2 Review Page 258 Question 16  a)  (a – 4)(a + 7) = a(a + 7) – 4(a + 7)                             = a2 + 7a – 4a – 28                              = a2 + 3a – 28   b)  (2x + 3)(5x + 2) = 2x(5x + 2) + 3(5x + 2)                                 = 10x2 + 4x + 15x + 6                                 = 10x2 + 19x + 6  c)  (–x + 5)(x + 5) = –x(x + 5) + 5(x + 5)                              = –x2 – 5x + 5x + 25                              = –x2 + 25  d)  (3y + 4)2 = (3y + 4)(3y + 4)                     = 3y(3y + 4) + 4(3y + 4)                     = 9y2 + 12y + 12y + 16                     = 9y2 + 24y + 16  e)  (a – 3b)(4a – b) = a(4a – b) – 3b(4a – b)                                = 4a2 – ab – 12ab + 3b2                                = 4a2 – 13ab + 3b2  f)  (v – 1)(2v2 – 4v – 9) = v(2v2 – 4v – 9) – 1(2v2 – 4v – 9)                                      = 2v3 – 4v2 – 9v – 2v2 + 4v + 9                                      = 2v3 – 6v2 – 5v + 9
4

1 に答える 1

2

役に立たなかった元の回答を削除しました

echo 'Unit 2 Review Page 257 Question 9  a)  12 (2)(2)(3)'\
| sed -n '/Page/{s/.*Page[ ][ ]*\([0-9][0-9]*\)[ ][ ]*Question[ ][ ]*\([0-9][0-9]*\).*$/pg\1_q\2/;p;q;}'

出力

pg257_q9

echo 'Unit 2 Review Page 258 Question 16  a)  (a  4)(a + 7) = a(a + 7)  4(a + 7)'\
| sed -n '/Page/{s/.*Page[ ][ ]*\([0-9][0-9]*\)[ ][ ]*Question[ ][ ]*\([0-9][0-9]*\).*$/pg\1_q\2/;p;q;}'

出力

pg258_q16

そうでなければ、あなたはそれを正しく持っていました!

(sedの処理はどちらの場合も同じであることに注意してください)。

末尾;p;q}とイニシャルを含めた{ので、sedスクリプトは「Page」の行を処理して終了します。

posix charクラスを基本用語、つまり[[:digit:]]=[0-9]に拡張し、を最初のcharクラスの繰り返しに置き換え、+その後に「ゼロ以上の」char「*」を付けて、を作成し[0-9][0-9]*ました。OReillyの第2版SedandAwkからSun3でsedを学んだ私の個人的な経験は、すべてのposixのものが気を散らすものであり、エラーのさらなる原因であるということです。私は明らかにここSOで少数派です;-)しかし、新しいsedにはいくつかの優れた機能があり、いずれにせよ.....

これがお役に立てば幸いです。

于 2012-05-21T17:02:07.790 に答える