sed bash变量删除文件中的一行

sed bash变量删除文件中的一行

我正在尝试在文件中执行特定操作,在 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从 开始1a=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

相关内容