shell - 文件中的文本替换,第 5h 行,从位置 18 到位置 145
问题描述
我有这个文本文件:
{
"name": "",
"auth": true,
"username": "rtorrent",
"password": "d5275b68305438499f9660b38980d6cef7ea97001efe873328de1d76838bc5bd15c99df8b432ba6fdcacbff82e3f3c4829d34589cf43236468d0d0b0a3500c1e"
}
现在,我希望能够使用示例替换d5275b68305438499f9660b38980d6cef7ea97001efe873328de1d76838bc5bd15c99df8b432ba6fdcacbff82e3f3c4829d34589cf43236468d0d0b0a3500 (字符串始终具有完全相同的长度,但值可以不同)
我已经尝试过使用sed:
sed -i 5s/./new-string/18 file.json
这基本上替换了第 5 行的文本,从位置 18 开始。我希望能够替换文本,从位置 18 开始直到位置 154,严格来说是""
. 上面的命令将剪切",
文件末尾的 ,如果它运行多次,则字符串每次都会变得越来越长。
非常感谢任何帮助。
解决方案
您可以使用例如 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
推荐阅读
- powershell - 如何在 mcr.microsoft.com/powershell 映像之外的 docker 容器中安装 powershell 模块?
- c++ - Qt C++:不同文件中相同命名空间的多个Q_NAMESPACE
- javascript - 相当于 php 的 $var=$_POST["var"] 在javascript中?
- python - 如何根据复杂的标准裁剪图像?
- nunit - NUnit 测试未运行并且旁边有蓝色感叹号图标
- c# - 如何将 Blazor 组件的输入传递到 Core MVC 控制器?
- java - log4j - RollingFileAppender - 日期模式和 MaxFileSize
- scala - 克服一些 Scala 类型系统的限制
- c# - DateTime 对象发生 FatalExecutionEngineError
- reactjs - react-google-login 是否需要额外授权?