示例代码,思路如下
while read url; do
wget -q $url -O - | grep -o -E 'href="([^"#]+)"' | grep "magazine/" | grep "https" | sort -u | sed -r 's/.*href="([^"]+).*/\1/g' >> list1
perl -ne 'print unless $dup{$_}++;' list1 > list
done < list
列表的第一行是
https://abc.xyz/issues/
,从这里 wget
想要找到一个指向上一“问题”的特定 url 链接,其格式为 https://abc.xyz/issues/yyyy/mm/dd
(通过 grep 过滤,按排序删除重复项,然后通过 sed 提取 url 链接),然后将 url 链接添加到“列表”中,这样的 url 链接然后用于获取“while read line”循环中的下一个 url 链接...并且 perl 行想要删除重复项在新的 url 链接添加到列表后,在循环中处理新的 url 链接之前,在列表中。
所以这就是想法,理想的结果应该是一个包含所有过去问题的数百个 url 链接的列表。希望得到一些建议或更好的简单解决方案(我自己对 shell 命令有非常基本的了解)
您正在写入正在读取的同一个文件。不要那样做。将
perl -ne 'print unless $dup{$_}++;' list1 > list; done < list
更改为 perl -ne 'print unless $dup{$_}++;' list1; done < list > list2
可以避免这个主要问题,但你还会遇到更多问题,包括不断追加到 list1
,因此 perl
必须在每次循环迭代时重新处理以前的内容。您可能应该使用 > list
而不是 >> list1
,但不知道为什么您甚至在那里使用文件而不是管道到 perl
。