【问题标题】:Extract pdf from html using sed使用 sed 从 html 中提取 pdf
【发布时间】:2019-05-14 03:00:36
【问题描述】:

我正在编写一个 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 命令来做到这一点。

谢谢。

【问题讨论】:

  • 是的。您可以构建一个正则表达式,在一个 sed 命令中完成所有这些步骤。现在,成本/收益将证明您是否这样做是合理的。

标签: html regex linux bash sed


【解决方案1】:

您可以将原始问题翻译成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 标志(打印匹配的内容)的组合将仅打印基于正则表达式 .*href="(.*\.pdf)".*$ 进行替换的行。 href 属性的值(括号中的捕获组)被\1 反向引用,因此整行都被替换为它。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-08-02
      • 2014-07-21
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多