首页 > 解决方案 > 文件中的文本替换,第 5h 行,从位置 18 到位置 145

问题描述

我有这个文本文件:

{
    "name": "",
    "auth": true,
    "username": "rtorrent",
    "password": "d5275b68305438499f9660b38980d6cef7ea97001efe873328de1d76838bc5bd15c99df8b432ba6fdcacbff82e3f3c4829d34589cf43236468d0d0b0a3500c1e"
}

现在,我希望能够使用示例替换d5275b68305438499f9660b38980d6cef7ea97001efe873328de1d76838bc5bd15c99df8b432ba6fdcacbff82e3f3c4829d34589cf43236468d0d0b0a3500 (字符串始终具有完全相同的长度,但值可以不同)

我已经尝试过使用sed

sed -i 5s/./new-string/18 file.json

这基本上替换了第 5 行的文本,从位置 18 开始。我希望能够替换文本,从位置 18 开始直到位置 154,严格来说是"". 上面的命令将剪切",文件末尾的 ,如果它运行多次,则字符串每次都会变得越来越长。

非常感谢任何帮助。

标签: shellsed

解决方案


您可以使用例如 awk :

$ awk -v var="new_string" 'NR==5{print substr($0,1,17) var substr($0,146);next}1' file
{
    "name": "",
    "auth": true,
    "username": "rtorrent",
    "password": "new_string"
}

但是有更好的工具可以更改 JSON 中的值,jq例如:

$ jq '.password="new_string"' file
{
  "name": "",
  "auth": true,
  "username": "rtorrent",
  "password": "new_string"
}

编辑:将 shell 变量传递$var给 awk时jq

$ var="new_string"
$ awk -v var="$var" 'NR==5{print substr($0,1,17) var substr($0,146);next}1' file

$ jq --arg var "$var" '.password=$var'

Edit2:总是有sed

$ sed -i "5s/\"[^\"]*\"/\"$var\"/2" file

推荐阅读