我正在编写一个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命令来执行此操作。
谢谢。
答案 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
结尾的行。