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

Shell 文件中的文本替换,在5h行上,从位置18到位置145,shell,sed,Shell,Sed,我有这个文本文件: { "name": "", "auth": true, "username": "rtorrent", "password": "d5275b68305438499f9660b38980d6cef7ea97001efe873328de1d76838bc5bd15c99df8b432ba6fdcacbff82e3f3c4829d34589cf43236468d0d0b0a3500c1e" } 现在,我希望能够使用sed替换D5275B68305

我有这个文本文件:

{
    "name": "",
    "auth": true,
    "username": "rtorrent",
    "password": "d5275b68305438499f9660b38980d6cef7ea97001efe873328de1d76838bc5bd15c99df8b432ba6fdcacbff82e3f3c4829d34589cf43236468d0d0b0a3500c1e"
}
现在,我希望能够使用sed替换D5275B6830543899F9660B38980D6CEF7EA97001EFE873328DE1D76838BC5BD15C99DF8B432BA6FDCACBFF82E3F3C4829D34589CF43236468D0D0B0A3500C1E。(字符串的长度始终完全相同,但值可以不同)

我已经用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"
}
Edit:将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

Edit2:始终存在
sed

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

例如,您可以使用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"
}
Edit:将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

Edit2:始终存在
sed

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

谢谢,这两种方法都有效…还有一件事,我应该从一开始就指定…新字符串是否是变量的值?如何实现?因为在这两个例子中,如果我用
$variable
替换
$new\u string
,例如,它不会放置var值…更新了处理变量的答案。再次感谢,它有效很好,但它实际上不做替换,只做打印(对于这两个示例)。如果我运行了任何命令,屏幕上的输出都是正确的,如果我检查该文件,它仍然是原始值EAH,您需要将输出重定向到一个新文件,并将旧文件替换为.GNU awk(在版本4.0 IIRC之后)has in place edit with
-i in place
。请参见edit2。谢谢,这两种方法都有效…还有一件事,我应该从一开始就指定…新字符串是否是变量的值?如何实现?因为在这两个示例中,如果我将
新字符串
替换为
$variable
,例如,它不会将var值…更新再次感谢,它工作得很好,但实际上它不做替换,只做打印(对于这两个例子)。如果我运行了任何命令,屏幕上的输出是正确的,如果我检查该文件,它仍然是原始值EAH,您需要将输出重定向到一个新文件,并用该文件替换旧文件。GNU awk(版本4.0 IIRC之后)已使用
-I inplace
进行在位编辑。请参阅edit2。