我有这个文本文件:
{
"name": "",
"auth": true,
"username": "rtorrent",
"password": "d5275b68305438499f9660b38980d6cef7ea97001efe873328de1d76838bc5bd15c99df8b432ba6fdcacbff82e3f3c4829d34589cf43236468d0d0b0a3500c1e"
}
现在,我希望能够使用sed替换 d5275b68305438499f9660b38980d6cef7ea97001bfe15c99df8b432ba6fdcacbff82e3f3c4829d34589cf43236468d0d0b0a3500c1e 。 (字符串的长度始终完全相同,但值可能不同)
我已尝试使用 sed :
sed -i 5s/./new-string/18 file.json
这基本上取代了第5行的文字,从第18位开始。我希望能够替换文本,正好从第18位开始直到位置154,严格来说是{{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