我正在尝试在文件中执行特定操作,在 1 上定义索引并逐行执行操作,删除文件行的内容,sed -i -e "{a}d"
问题是它似乎只逐一下载行 1 ,例如,在一个文件上
1
2
3
4
5
结果是 2 3 5,所以只下载 1 和 4。我做错了什么?
#!/usr/bin/bash
a=0
filename="$1"
while read -r line; do
echo $a
name="$line"
Operation
sed -i -e "${a}d" $1
let a+=1
done < "$filename"
来自评论:我想做的是:
- 回显当前所在行
- 对文件执行操作(在本例中为 wget)
- 删除刚刚下载的行
- 增加当前行
- 直到不再有线条为止
答案1
您选择的程序不正确。
假设 的值a
从 开始1
:a=1
当脚本读取filename
在线时done<"$filename"
,文件的内容(因为它是在那个时间点)被读入。然后,您修改同一个文件到位通过删除一行(假设第一行),那么下一次读取将采用第二个原始行(现在是文件上的第一行),但会删除当前文件上的行索引 2(现在是第三行)。等等等等。
要查看会发生什么,请运行以下脚本:
#!/usr/bin/bash
a=1
filename=infile
seq 5 >"$filename"
while read -r line; do
echo "Read line $line for index $a"
echo "Will remove line $(sed "${a}!d" "$filename")"
sed -ie "${a}d" "$filename"
echo;echo next
let a+=1
done < "$filename"
这将做到这一点:
$ ./script
Read line 1 for index 1
Will remove line 1
next
Read line 2 for index 2
Will remove line 3
next
Read line 3 for index 3
Will remove line 5
next
Read line 4 for index 4
Will remove line
next
Read line 5 for index 5
Will remove line
next
如您所见,第 1、3、5 行已被删除。
正确做法:要么
- 从最后开始
- 在附加文件上存储索引
- 或仅针对文件的第一行重新启动该进程,直到文件为空。
使用您已知的工具实施第三个选项:
#!/usr/bin/bash
filename=infile
seq 5 >"$filename"
while [[ -s "$filename" ]]; do
name=$(head -n1 "$filename")
echo wget "$name"
sed -i '1d' "$filename"
done
答案2
恕我直言,编辑您正在阅读的文件充满了危险。让我建议不同的解决方案:
urls.lst
逐行读取输入列表( )wget
网址- 如果成功将 URL 附加到第二个文件 (
received.lst
)
如果该过程被中断并且您想使用尚未获得的 URL 列表重新启动,您可以通过以下方式获取该列表:
diff --new-line-format="" --unchanged-line-format="" urls.lst received.lst