我想要做的是:有一个文件,在里面,有一行(它肯定会在那里,100%)在这个模型中:
name_of_the_value=xxx
价值在哪里数值和 未知因为它在设备和设备之间发生变化...我需要以某种方式获取该xxx
值并将其替换为用户通过TextField
(我为此使用 Java,它用于 Android 应用程序,但它无论如何都是纯 shell 脚本)给出的另一个值。
已验证:
- 查找并删除整行并替换为整行,例如删除
name_of_the_value=xxx
并替换为name_of_the_value=user_value
- 仅替换
xxx
(值)部分 - 用“#”注释任何现有的匹配行,并将整行写在文件底部
但是我该如何使用echo
,sed
或者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