bash“while read line”循环,以变量作为文件输入

问题描述 投票:0回答:1

示例代码,思路如下

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 命令有非常基本的了解)

bash loops
1个回答
0
投票

您正在写入正在读取的同一个文件。不要那样做。将

perl -ne 'print unless $dup{$_}++;' list1 > list;  done < list
更改为
perl -ne 'print unless $dup{$_}++;' list1; done < list > list2
可以避免这个主要问题,但你还会遇到更多问题,包括不断追加到
list1
,因此
perl
必须在每次循环迭代时重新处理以前的内容。您可能应该使用
> list
而不是
>> list1
,但不知道为什么您甚至在那里使用文件而不是管道到
perl

© www.soinside.com 2019 - 2024. All rights reserved.