替换文本并插入更多文本

时间:2017-10-24 21:47:38

标签: bash shell sed

我需要替换文件中的一些文本,并在文件结尾之前添加几行。

我有这个:

{
  "something": "option1",
  "other": [
    "value",
  ]
}

我需要这个:

{
  "something": "option2",
  "other": [
    "value",
  ],
  "more": {
    "stuff": "yey!"
  }
}

我试过这个scipt:

stuff=$1

value=",
  \"more\": {
    \"stuff\": \"$stuff\"
  }"

sed -e "s/option1/option2" -e '$ \i$value' \
  file1.json > file2.json

但我明白了:

{
  "something": "option2",
  "other": [
    "value",
  ]
$value
}

我该如何正确地做到这一点?

2 个答案:

答案 0 :(得分:1)

操纵json数据的唯一正确方法是使用JSON解析器/处理器。期!

使用 jq 处理器,它可以建立你的关系"使用JSON轻松舒适:

有效的JSON file1.json

{
  "something": "option1",
  "other": [
    "value"
  ]
}
stuff="jq got you"
jq --arg stuff "$stuff" '.more = {stuff: $stuff}' file1.json

输出:

{
  "something": "option1",
  "other": [
    "value"
  ],
  "more": {
    "stuff": "jq got you"
  }
}

答案 1 :(得分:0)

这不是更好的方法,但如果你想用sed,你可以尝试

使用gnu sed

echo "$value" | sed ':A;/\n.*}/!{N;bA};h;s/.*//;N;$!{s/.*\n//;:B;N;$!{H;s/option1/option2/;s/\n.*//p;g;s/\(.*\)\(\n.*\n[^\n]*\)/\1/;x;s/\(.*\n\)\([^\n]*\)/\2/;bB}};H;g;s/\(.*\n\)\([^\n]*\)\(\n[^\n]*\)/\2/;G;s/\(.*\n\)\([^\n]*\n\)\([^\n]*\)/\1\3/;s/\([^\n]\)\(\n\)\(.*\)/\1\3/' /dev/stdin infile

或使用OpenBSD sed

cat scriptsed
sed ':A;/\n.*}/!{N;bA
}
h;s/.*//;N;$!{s/.*\n//;:B;N;$!{H;s/option1/option2/;s/\n.*//p;g;s/\(.*\)\(\n.*\n[^\n]*\)/\1/;x;s/\(.*\n\)\([^\n]*\)/\2/;bB
}
}
H;g;s/\(.*\n\)\([^\n]*\)\(\n[^\n]*\)/\2/;G;s/\(.*\n\)\([^\n]*\n\)\([^\n]*\)/\1\3/;s/\([^\n]\)\(\n\)\(.*\)/\1\3/'

并称之为

(echo "$value";cat infile) | ./scriptsed