![Linux sed命令使用正则表达式替换含有空格和特殊字符的两行](https://linux22.com/image/146097/Linux%20sed%E5%91%BD%E4%BB%A4%E4%BD%BF%E7%94%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%9B%BF%E6%8D%A2%E5%90%AB%E6%9C%89%E7%A9%BA%E6%A0%BC%E5%92%8C%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6%E7%9A%84%E4%B8%A4%E8%A1%8C.png)
我有一个包含以下示例文本的文件。
"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 $