文本替换在5h行的文件中,从位置18到位置145

时间:2018-05-15 06:31:17

标签: shell sed

我有这个文本文件:

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

现在,我希望能够使用sed替换 d5275b68305438499f9660b38980d6cef7ea97001bfe15c99df8b432ba6fdcacbff82e3f3c4829d34589cf43236468d0d0b0a3500c1e 。 (字符串的长度始终完全相同,但值可能不同)

我已尝试使用 sed

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

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

你可以使用例如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