稍后更改文件中的值

稍后更改文件中的值

我有一个像数据库一样的文件,其中保存姓名、出生日期、礼物,我想知道这个人是否收到了我们的礼物。这些日期在文件中按制表符分隔,每行一个人,例如:

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'

相关内容