如果我不知道文件内某一行的值,该如何获取和更改该行的值?

如果我不知道文件内某一行的值,该如何获取和更改该行的值?

我想要做的是:有一个文件,在里面,有一行(它肯定会在那里,100%)在这个模型中:

name_of_the_value=xxx

价值在哪里数值未知因为它在设备和设备之间发生变化...我需要以某种方式获取该xxx值并将其替换为用户通过TextField(我为此使用 Java,它用于 Android 应用程序,但它无论如何都是纯 shell 脚本)给出的另一个值。

已验证:

  1. 查找并删除整行并替换为整行,例如删除name_of_the_value=xxx并替换为name_of_the_value=user_value
  2. 仅替换xxx(值)部分
  3. 用“#”注释任何现有的匹配行,并将整行写在文件底部

但是我该如何使用echosed或者awk如果我不知道这个值呢?

答案1

假设 user_value 部分始终为 3 个字符长,您可以这样做:

sed "s/name_of_the_value=.{0,3}/name_of_the_value=$new_value/"

或者如果你确定该行后面没有任何内容,你也可以使用:

sed "s/name_of_the_value=.*/name_of_the_value=$new_value/"

我希望我正确使用了 REGEX,我在这方面不是专业人士。因此,值最好始终为 3 个字符长(十六进制格式),因为十进制在低于 100 的情况下并不总是 3 个字符长。第二种情况应该有效,即使数字低于 100,但它假设整个部分name_of_the_value=user_value都在一行中。现在在终端中测试它,第二种情况的输出如下所示:

video@NAUTH:~$ echo "name_of_the_value=xxx" | sed "s/name_of_the_value=.*/name_of_the_value=$USER/"
name_of_the_value=video

当然,您需要将输出通过管道传输回文件,或者使用临时文件进行交换。您可以使用:

sed "s/name_of_the_value=.*/name_of_the_value=$new_value/" /input_file | sponge /input_file

Sed 仅在读取文件时更改输出,而不是写入文件,sponge 会保存输出,直到您完成并将更改写回。

如果您不想或不能使用 sponge ,请在第二个文件中写入,然后像这个命令链一样切换它们。

sed "s/name_of_the_value=.*/name_of_the_value=$new_value/" /input_file > /output_file
rm -v /input_file
mv -v /output_file /input_file

正如@kos 在评论中指出的那样,您也可以使用命令-i的标志sed将数据写回到输入文件中,而无需使用临时文件或sponge

sed -i "s/name_of_the_value=.*/name_of_the_value=$new_value/" /input_file

相关内容