bash - 在读取期间删除 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
因为我想在阅读后删除行。
注意:-我在这里简化了我的问题。实际用例是:-
我需要在线执行一些操作,除了读取它并且输入文件太长并且我的操作在两者之间以某种方式失败。所以我希望删除我读过的那些行,这样如果我开始这个过程同样,它不会从头开始,而是从卡住的地方开始。
请帮忙。
解决方案
您实际上说过您希望您的进程可以重新启动。根据您如何定义成功完成 while 循环的迭代,您应该将一个行号存储在一个单独的文件 中x
,它表示您已成功处理了多少行。如果该文件不存在,则假设您将从第 1 行开始阅读。
否则,您将获得x
into 变量的内容,n
然后您将$file
在 $n + 1 行开始阅读。
您如何从特定行开始阅读取决于我们还不知道的限制。
您可以这样做的一种方法是sed
将行 $n + 1 放入临时文件中,删除$file
然后将临时文件移动到$file
您的 while 循环开始之前。
还有其他解决方案,但每个解决方案都可能无法优雅地满足您的限制。
但是您需要仔细考虑如果其他进程正在修改内容$file
以及何时更改内容会发生什么。如果它仅在您的 bash 脚本运行之前或之后更改内容,那么您可能可以继续沿着这条路径前进。否则,您需要解决同步问题。
推荐阅读
- python - Pandas DateTimeIndex 每年的近似频率
- vba - 更新 CustomXMLPart
- r - 如何计算 R 中多个站点的最大 NA 数据差距?
- reactjs - 更新到钩子导致无效尝试解构不可迭代的实例
- java - 引起:java.lang.ClassNotFoundException:springfox.documentation.common.ClassPresentInClassPathCondition
- excel - VBA删除所有带有空格的行并删除行将包含字符串的单元格
- stripe-payments - 如何使用 Stripe 对既是信用卡又是债务的卡进行收费
- r - As.formula 不能循环工作?(调整回归)
- android - # 导致webview内容被剪切
- r - 在ggplot2中手动添加渐变色列