sed команда заменить и записать

Данные в / proc вообще не обновляются. Генерируется по запросу.

Когда вы читаете из / proc (или вообще из любого файла), вы вызываете ядро. Если вы читаете «настоящий» файл, тогда ядро ​​(при условии кэширования, разрешений и т. Д.) Будет проходить через файловую систему и извлекать запрошенные вами данные. Если вы читаете «файл» / proc , ядро ​​сгенерирует соответствующие данные на лету.

Этот метод стал довольно популярным и теперь широко используется в различных областях файловой системы.Например, виртуальная файловая система / sys очень похожа на / proc с архитектурной точки зрения, хотя ее содержимое полностью отличается. В современных системах вы можете обнаружить, что / dev также виртуальная файловая система , так как в противном случае довольно болезненно хранить файлы в / dev до -соответствие аппаратным реалиям. Некоторые службы пользовательского пространства предоставляют свои собственные виртуальные файловые системы через FUSE .

0
16.10.2018, 22:01
3 ответа

Пример файла JSON:

[
  {
    "host": "myhost",
    "schema": "AAAAA",
    "lunch": "sandwich"
  },
  {
    "host": "myotherhost",
    "schema": "QQQQQ",
    "lunch": "pizza"
  }
]

Мы хотели бы заменить каждый schema, то есть AAAAA, на BBBBB. Мы можем сделать это с помощьюjq:

$ jq 'map(if.schema == "AAAAA" then.schema = "BBBBB" else. end)' file.json
[
  {
    "host": "myhost",
    "schema": "BBBBB",
    "lunch": "sandwhich"
  },
  {
    "host": "myotherhost",
    "schema": "QQQQQ",
    "lunch": "pizza"
  }
]

Если не имеет значения, какой была старая схема:

$ jq 'map(.schema = "BBBBB")' file.json
[
  {
    "host": "myhost",
    "schema": "BBBBB",
    "lunch": "sandwhich"
  },
  {
    "host": "myotherhost",
    "schema": "BBBBB",
    "lunch": "pizza"
  }
]

Поскольку jqявляется правильным парсером JSON, это будет работать, даже если файл будет представлен в более компактной форме, например, в виде одной строки

[{"host":"myhost","schema":"AAAAA","lunch":"sandwhich"},{"host":"myotherhost","schema":"QQQQQ","lunch":"pizza"}]

Для актуальной проблемы(в комментариях ), которая состоит в том, чтобы найти элемент в .rules.behavior[], который имеет ключ .nameсо значением mPulse, а затем изменить этот элемент .options.apiKeyв другое значение:

jq '.rules.behaviors = [.rules.behaviors[]|select(.name == "mPulse").options.apiKey = "XXX"]' file.json

То есть переписать массив .rules.behaviourтаким образом, чтобы элемент, чей .nameключ равен mPulse, получил новый .options.apiKey.

4
28.01.2020, 02:16

Для этого вам не нужны grep, awkи sed; awkможет выполнять все задачи (не проверено):

awk '/schema/ {$3 = "BBBBB"} 1' test.json > /tmp/$$ && mv /tmp/$$ test.json

Пожалуйста, попробуйте и сообщите об этом.

0
28.01.2020, 02:16

Несколько оптимизаций, не последней из которых является отказ от «бесполезного использования cat». Вам не нужно cat file | grep pattern; можно просто grep pattern file. А так как вы grepпингуетесь в awk, это тоже можно упростить:

currentSchema="$( cat test.json | grep schema | awk '{print $3}' )"

становится

currentSchema="$( awk '/schema/ {print $3}' test.json )"

Теперь о вашем sedскрипте. Вы используете сильные кавычки(')вокруг вашей команды sed, что означает, что ваши переменные оболочки не будут проанализированы. Вам нужно использовать Weak Quotes ("), чтобы это работало:

currentSchema="$( awk '/schema/ {print $3}' test.json )"
sed --in-place "s/$currentSchema/BBBBB/" test.json
1
28.01.2020, 02:16

Теги

Похожие вопросы