簡體   English   中英

Shell腳本從文件內部使用字符串重命名文件

[英]Shell script to rename file with string from inside file

我一直在論壇和stackoverflow上搜索它; 它一定在這里某處,但我找不到。
我在Mac上,使用終端運行Shell腳本以根據文件內容重命名一些pdf文件。

我有一個充滿pdf的目錄,我正在使用開源pdfbox導出到文本文件。 生成的文件與pdf文件具有相同的名稱,但以.txt結尾。 我創建了文本文件,以便可以在文件內找到格式為Page xx Question xx的字符串; 例如Page 43 Question 2 給定這個示例,我想將pdf文件重命名為pg43_q2.pdf

我想我想要的正則表達式是這樣的: /Page\\s+(\\d+)Question\\s+(\\d+)但是我不確定如何讀取兩個捕獲的數字並將它們保存為一個字符串,我可以將其用作文檔名稱。

到目前為止,我的腳本是:

#!/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變量為空。

可以正常工作的已轉換文件的第三行:

Unit 2 Review Page 257 Question 9  a)  12 (2)(2)(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

刪除了無用的原始答案

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的第二版Sed和Awk(帶有梳狀綁定!)上在Sun 3上學習到sed的,我發現所有posix都是分散注意力的內容,也是造成錯誤的另一個原因。 我顯然在這方面是少數派;-),但我願意承認,較新的sed具有一些很棒的功能,無論如何.....

我希望這有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM