Linux sed命令使用正则表达式替换含有空格和特殊字符的两行

Linux sed命令使用正则表达式替换含有空格和特殊字符的两行

我有一个包含以下示例文本的文件。

"list-value": {
    "object-value": {
      "value": "example-value-123"
    }
 }

我想通过将列表值中的模式与值文本“example-value-changed-567”匹配来更改值文本“example-value-123”

例子

 "list-value": {
        "object-value": {
          "value": "example-value-changed-567"
        }
     }

我不想匹配从值开始的文本模式。我必须从列表值开始匹配模式。我尝试创建正则表达式,但在找到新行后无法匹配模式。

到目前为止我已经尝试过的正则表达式

 $ sed -i 's/ [[:space:]]\"list-value\":[[:space:]]{[[:space:]]N;[[:space:]]\"objet-value\"[[:space:]]:[[:space:]]\"[\w+\W+]+\"[[:space:]]} / [[:space:]]\"list-value\":[[:space:]]{[[:space:]]N;[[:space:]]\"objet-value\"[[:space:]]:[[:space:]]\"example-value-changed-567\"[[:space:]]}/g' file.json

对于上述命令,我收到以下错误

sed: 1: "file. ...": command a expects \ followed by text

我在线创建了一个正则表达式,但它无法使用 sed 命令运行。

\s+"list-value":\s+{\s+"value"\s*:\s+"[\w+\W+]+"\s+}

我需要为 sed 命令找到更好且有效的正则表达式。

答案1

假设 JSON 文档格式正确,如下所示

{
  "list-value": {
    "object-value": {
      "value": "example-value-123"
    }
  }
}

jq可用于修改该值:

$ jq '."list-value"."object-value".value="example-value-changed-567"' file.json
{
  "list-value": {
    "object-value": {
      "value": "example-value-changed-567"
    }
  }
}

结果可能会被重定向到一个新文件,如果您希望更改,该文件可以替换原始文件:

tmpfile=$(mktemp)
cp file.json "$tmpfile"
jq '."list-value"."object-value".value="example-value-changed-567"' "$tmpfile" >file.json
rm "$tmpfile"

我会避免使用面向行的工具(如sed.如果有适合您可以使用的格式的解析器,请改用它。 JSON 解析器适用于所有主要编程语言。这使您的代码更加健壮,因为您不必关心输入数据中使用的实际格式或字符编码。请注意,例如,您的文档相当于

{ "list-value": {
    "object-value": { "value": 
"example-value-123"
    }
  }
}

答案2

我想你正在寻找这个作为 sed 命令:

sed -i.backup '/list-value/{N;N;s/example-value-123/example-value-changed-567/}' file.json

例子:

$ cat ./file.json
"list-value": {
    "object-value": {
        "value": "example-value-123"
    }
}
"list-value-2": {
    "object-value": {
        "value": "example-value-123"
    }
}

# please note this creates a backup file: file.json.backup
$ sed -i.backup '/list-value/{N;N;s/example-value-123/example-value-changed-567/}' file.json

$ cat ./file.json
"list-value": {
    "object-value": {
        "value": "example-value-changed-567"
    }
}
"list-value-2": {
    "object-value": {
        "value": "example-value-123"
    }
}

答案3

嵌套结构(即 JSON)必须由结构感知(此处为 JSON)例程进行处理。每当您尝试通过(多)线路感知例程对其进行处理时,您总是会遇到误报。

因此,您的要求(同样,假设它是正确形成的 JSON)可以通过以下方式轻松实现jtc:

bash $ jtc -w'[list-value]<value>l' -u'"example-value-changed-567"' file.json
{
   "list-value": {
      "object-value": {
         "value": "example-value-changed-567"
      }
   }
}
bash $ 

相关内容