首页 > 解决方案 > 在读取期间删除 bash 中的当前行

问题描述

我正在使用 bash 读取文件,在对特定行进行操作后,我需要从输入文件中删除该行。

您能否建议一些使用 sed 或任何其他方式的方法?

我试过像这样使用 sed 命令:-

#!/bin/sh

file=/Volumes/workplace/GeneratedRules.ion

while read line;do
printf "%s\n" "$line"
sed  '1d' $file
done <$file

我在这个程序中的目标是读取一行然后删除它。

输入 :-

AllIsWell
LetsHopeForBest
YouCanMakeIt

但是我得到的输出比我想象的更奇怪。

输出 :-

AllIsWell
LetsHopeForBest
YouCanMakeIt
LetsHopeForBest
LetsHopeForBest
YouCanMakeIt
YouCanMakeIt
LetsHopeForBest
YouCanMakeIt

但我需要输出为:

AllIsWell 
LetsHopeForBest
YouCanMakeIt

因为我想在阅读后删除行。

注意:-我在这里简化了我的问题。实际用例是:-

我需要在线执行一些操作,除了读取它并且输入文件太长并且我的操作在两者之间以某种方式失败。所以我希望删除我读过的那些行,这样如果我开始这个过程同样,它不会从头开始,而是从卡住的地方开始。

请帮忙。

标签: bashshellsed

解决方案


您实际上说过您希望您的进程可以重新启动。根据您如何定义成功完成 while 循环的迭代,您应该将一个行号存储在一个单独的文件 中x,它表示您已成功处理了多少行。如果该文件不存在,则假设您将从第 1 行开始阅读。

否则,您将获得xinto 变量的内容,n然后您将$file在 $n + 1 行开始阅读。

您如何从特定行开始阅读取决于我们还不知道的限制。

您可以这样做的一种方法是sed将行 $n + 1 放入临时文件中,删除$file然后将临时文件移动到$file您的 while 循环开始之前。

还有其他解决方案,但每个解决方案都可能无法优雅地满足您的限制。

但是您需要仔细考虑如果其他进程正在修改内容$file以及何时更改内容会发生什么。如果它仅在您的 bash 脚本运行之前或之后更改内容,那么您可能可以继续沿着这条路径前进。否则,您需要解决同步问题。


推荐阅读