![稍后更改文件中的值](https://linux22.com/image/151401/%E7%A8%8D%E5%90%8E%E6%9B%B4%E6%94%B9%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E5%80%BC.png)
我有一个像数据库一样的文件,其中保存姓名、出生日期、礼物,我想知道这个人是否收到了我们的礼物。这些日期在文件中按制表符分隔,每行一个人,例如:
name1 surname1 dateofbirth1 gift1
name2 surname2 dateofbirth2 gift2
在礼品栏中,我保存“是”或“否”,我的代码如下所示:
while IFS=$'\t' read -r name surname dob gift; do
if [[ "$gift" == "No" ]]; then
echo "Congrats, here is your gift
gift=Yes
fi
done < "file.txt"
但礼物栏似乎没有变成是,似乎只是作为辅助变量存在。如何将该列中该行的值更改为 yes?
答案1
从文件中读取一个值,然后更改保存该值的变量不会改变文件中的值。
相反,您必须检测哪些值需要更改,更改它们,然后将完整文件(包括修改后的值)输出到新文件。然后可以将这个新文件移至原始名称,替换旧文件。
另外,在 shell 中解析文本通常是要避免。相反,考虑使用类似的东西awk
:
awk -F '\t' 'BEGIN { OFS=FS }
$4 == "No" { print "Congrats, here is your gift" >"/dev/stderr" }
{ $4 = "Yes"; print }' file.txt >newfile.txt
这将逐行读取文件,每当第四列出现时No
,它就会输出文本Congrats, here is your gift
。
Yes
然后,对于每一行,在打印整行之前,将第四列无条件设置为。
按照上面编写和运行程序的方式,Congrats...
消息将出现在终端中(它被写入标准错误流),而文件的更新内容将被写入名为newfile.txt
.
BEGIN
代码开头的块只是将输出字段分隔符 设为与OFS
输入字段分隔符 相同的值,FS
后者在命令行上使用 设为制表符-F '\t'
。