我一直在论坛和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