linux中循环批量下载文本文件中的超链接图片,然后在h2中通过sql语句批量更新图片链接地址

linux中循环批量下载文本文件中的超链接图片,然后在h2中通过sql语句批量更新图片链接地址

发现halo的文章中很多图片的超链接地址是这样的:
<div class="content"><img src="https://doc-1256053707.cos.ap-beijing.myqcloud.com/adfasdfasds32323we.png" alt="adfasdfasds32323we" /></div>
图片都是存在云端,不在本地系统的附件库中,于是想着把云端的图片都拉取到本地,然后更新文章中的图片链接地址。

步骤

1 拉取云端的图片到本地

shell脚本如下:

#!/bin/bash
# 用于设置每篇文章中的图片链接下载完图片后的存储路径,如:pics1,pics2,...
count=1

find /mnt/d/spark/ -name '*.html' | while read article
do
        # article=/mnt/d/spark/bigdata.html
        egrep 'https://doc-.*\.cos\.ap-beijing\.myqcloud\.com/.*\.png' $article | awk '{print $2}' | while read line
        do
                #echo $line
                tmp=${line#*\"}
                src=${tmp%\"*}
                #wget -bcP pics${count}/ $src > /dev/null
                wget -bcP pics/ $src > /dev/null
        #done <<< "`egrep 'https://doc-[0-9]{10}.cos.ap-beijing.myqcloud.com/[0-9]{14}.png' $article | awk '{print $2}'`"
        done

        rm -f ./wget-log*
        #let count++
        count=$(($count+1))
done

#sed -n 's/https:\/\/doc-[0-9]{10}.cos.ap-beijing.myqcloud.com//http://mediocre/g' $article

然后通过scp命令远程拷贝图片到系统所在服务器:
scp -r pics/* lenovo:/root/.halo/upload/2020/4/

2 修改halo的文章中的图片链接地址

查看所有需要处理的文章:
SELECT ID,TITLE FROM POSTS 
WHERE REGEXP_LIKE(ORIGINAL_CONTENT, 'https://doc-.*\.cos\.ap-beijing\.myqcloud\.com/', 'im');

SELECT ID,TITLE,ORIGINAL_CONTENT FROM POSTS 
WHERE REGEXP_LIKE(ORIGINAL_CONTENT, 'alt=".+"', 'im');

ID  	TITLE  
46	搭建 (OK)
52	Kudu (OK)
56	Structured Streaming (OK)
57	Spark Streaming(OK)
58	sparksql (OK)
59	sparksql2
62 ge4)-sparksql
64	Spark原理_运行过程_高级特性 (OK)
65	rdd算子1
66	rdd算子2
67	rdd算子3
96 概述:1-4 (OK)
418	报表生成 md格式的图片
419	既有md格式的图片,又有html格式的图片:
14 rows


SELECT ID,TITLE,ORIGINAL_CONTENT  FROM POSTS 
WHERE REGEXP_LIKE(ORIGINAL_CONTENT, '!\[.+\]', 'im');
AND ID IN (320,363,418,493,494,495,496,504);

ID  	TITLE
320	JAVA运算符总结 (OK)  
363	换行符号CRLF、CR、LF
418	flink1
493	flink2
494	flink3
495	flink4
496	flink5
504	kafka
8 rows
=================================

概述
https://doc-1256053707.cos.ap-beijing.myqcloud.com/sadfasdasdfasdf3234231s1.png
https://doc-1256053707.cos.ap-beijing.myqcloud.com/sadfasdasdfasdf3234231s2.png
https://doc-1256053707.cos.ap-beijing.myqcloud.com/sadfasdasdfasdf3234231s3.png
http://vserver:6666/upload/2020/4/
=================================

UPDATE POSTS SET ORIGINAL_CONTENT = REGEXP_REPLACE(ORIGINAL_CONTENT, 'https://doc-.*\.cos\.ap-beijing\.myqcloud\.com/', 'http://vserver:6666/upload/2020/4/') 
WHERE REGEXP_LIKE(ORIGINAL_CONTENT, 'https://doc-.*\.cos\.ap-beijing\.myqcloud\.com/', 'im'); 
UPDATE POSTS SET FORMAT_CONTENT = REGEXP_REPLACE(FORMAT_CONTENT, 'https://doc-.*\.cos\.ap-beijing\.myqcloud\.com/', 'http://vserver:6666/upload/2020/4/') 
WHERE REGEXP_LIKE(FORMAT_CONTENT, 'https://doc-.*\.cos\.ap-beijing\.myqcloud\.com/', 'im');

-- 有漏洞,该REGEXP_REPLACE方法是在一行中最大程度匹配,将width属性替换没了,下次注意了。
-- 解决方法:将`'alt=".+"'` 修改为 `'alt=".+?"'`  

UPDATE POSTS SET ORIGINAL_CONTENT = REGEXP_REPLACE(ORIGINAL_CONTENT, 'alt=".+"', 'alt=""') 
WHERE REGEXP_LIKE(ORIGINAL_CONTENT, 'alt=".+"', 'im');
UPDATE POSTS SET FORMAT_CONTENT = REGEXP_REPLACE(FORMAT_CONTENT, 'alt=".+"', 'alt=""') 
WHERE REGEXP_LIKE(FORMAT_CONTENT, 'alt=".+"', 'im');

UPDATE POSTS SET ORIGINAL_CONTENT = REGEXP_REPLACE(ORIGINAL_CONTENT, '!\[.+\]', '![]') 
WHERE REGEXP_LIKE(ORIGINAL_CONTENT, '!\[.+\]', 'im');

SELECT ID,TITLE,FORMAT_CONTENT FROM POSTS 
WHERE REGEXP_LIKE(FORMAT_CONTENT, '!\[.+\]', 'im')
AND ID=320;

知识扩展:正则表达式中 ? 的另一个作用:
当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。
例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。

posted @ 2021-08-26 11:29  mediocrep  阅读(397)  评论(0编辑  收藏  举报
既然选择了远方,便只顾风雨兼程!