linux - 用字符串替换文件中的一行

标签 linux shell sed awk

我有一个包含以下内容的文件 file1

{"name":"clio5", "value":"13"}
{"name":"citroen_c4", "value":"23"}
{"name":"citroen_c3", "value":"12"}
{"name":"golf4", "value":"16"}
{"name":"golf3", "value":"8"}

我想查找包含单词 clio5 的行,然后用以下字符串替换找到的行

string='{"name":"clio5", "value":"1568688554"}'

最佳答案

$ string='{"name":"clio5", "value":"1568688554"}'
$ awk -F'"(:|, *)"' -v string="$string" 'BEGIN{split(string,s)} {print ($2==s[2]?string:$0)}' file
{"name":"clio5", "value":"1568688554"}
{"name":"citroen_c4", "value":"23"}
{"name":"citroen_c3", "value":"12"}
{"name":"golf4", "value":"16"}
{"name":"golf3", "value":"8"}

$ string='{"name":"citroen_c3", "value":"1568688554"}'
$ awk -F'"(:|, *)"' -v string="$string" 'BEGIN{split(string,s)} {print ($2==s[2]?string:$0)}' file
{"name":"clio5", "value":"13"}
{"name":"citroen_c4", "value":"23"}
{"name":"citroen_c3", "value":"1568688554"}
{"name":"golf4", "value":"16"}
{"name":"golf3", "value":"8"}

根据@dogbane 的评论更新了上面的内容,因此即使文本包含 " 也能正常工作。如果文本可以包含 ":",它仍然会失败(有适当的转义),但这似乎不太可能,OP 可以告诉我们这是否是一个有效的问题。

关于linux - 用字符串替换文件中的一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17790340/

相关文章:

bash - 为什么运行 sed 命令会截断我路径的第一个字母?

linux - 如何调试 tokio 任务挂起的位置?

java - 在目录内的所有文件中搜索字符串

c++ - 在 Linux 上与 Eclipse 交叉编译,在 Windows 上与 Eclipse 交叉编译?

c++ - 跟踪 undefined reference

linux - 使用 sed 在文件中插入一些文本

bash - 确定远程机器上的空闲线程数

java - kdb q - 尽管设置了 $QHOME,但仍未找到许可证

bash - 我可以在命令之间进行管道传输,并从不同的目录运行程序吗?

regex - 使用 sed 一个接一个地添加一个文本 block