使用sed从html提取pdf

时间:2018-12-12 22:53:50

标签: html regex linux bash sed

我正在编写一个bash脚本,该脚本从html提取pdf文件并下载。这是提取的代码行:

 curl -s https://info.uqam.ca/\~privat/INF1070/ |
              sed 's/.*href="//' |
              sed 's/".*//' |
              sed '/^[^\.]/d' |
              sed '/\.[^p][^d][^f]$/d' |
              sed '/^$/d' |
              sed '/\/$/d'

结果:

./07b-reseau.pdf
./07a-reseau.pdf
./06b-script.pdf
./06a-script.pdf
./05-processus.pdf
./04b-regex.pdf
./181-quiz1-g1-sujet.pdf
./03b-fichiers-solution.pdf
./04a-regex.pdf
./03d-fichiers.pdf
./03c-fichiers.pdf
./03b-fichiers.pdf
./03a-fichiers.pdf
./02-shell.pdf
./01-intro.pdf
./01-intro.pdf
./02-shell.pdf
./03a-fichiers.pdf
./03b-fichiers.pdf
./03b-fichiers-solution.pdf
./03c-fichiers.pdf
./03d-fichiers.pdf
./04a-regex.pdf
./04b-regex.pdf
./05-processus.pdf
./06a-script.pdf
./06b-script.pdf
./07a-reseau.pdf
./07b-reseau.pdf
./181-quiz1-g1-sujet.pdf

它工作正常,但我想知道是否有更好的方法(始终使用sed)来使用较少的sed命令来执行此操作。

谢谢。

2 个答案:

答案 0 :(得分:0)

您可以将原始问题翻译成How to output only captured groups with sed?之类的内容。这个单线应该为您解决问题:

curl -s https://info.uqam.ca/\~privat/INF1070/ | sed -rn 's/.*href="(.*\.pdf)".*$/\1/p'

产生所需的输出。

如果-n选项(不打印)和p标志(打印匹配项)的组合将仅打印基于正则表达式{{1}进行替换的行}。 href 属性的值(括号中的捕获组)用.*href="(.*\.pdf)".*$返回引用,因此整行被其替换。

答案 1 :(得分:0)

这可能对您有用(GNU sed):

sed -r '/\n/!s/href="(\.[^"]*\.pdf)"/\n\1\n/g;/\`[^\n]*\.pdf$/MP;D' file

这会将每个pdf文件放在单独的一行(一行中有多行),并且仅打印出以.pdf结尾的行。