br comando para substituir e escrever

0

Eu estou tentando substituir a seguinte string por outra de um arquivo que contém poucas linhas.

"schema" : "AAAAA",

PARA

"schema" : "BBBBB",

Atualmente, estou fazendo o seguinte comando para obter a linha correspondente com "schema"

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

Isso me dará o valor "AAAAA",

Eu gostaria de substituir AAAAA por BBBBB

Eu usei o seguinte comando

sed -e 's/$currentSchema/BBBBB/p' test.json

No entanto, não é possível substituir no mesmo arquivo.

    
por user3613331 16.10.2018 / 19:19

3 respostas

4

Exemplo de arquivo JSON:

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

Gostaríamos de substituir cada schema que é AAAAA por BBBBB . Nós podemos fazer isso com 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"
  }
]

Se não importa qual era o esquema antigo:

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

Como jq é um analisador JSON adequado, isso funcionaria mesmo se o arquivo fosse apresentado de forma mais compacta, por exemplo, como a linha única

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

Para o problema real ( nos comentários ), que é encontrar o elemento em .rules.behavior[] que tem uma chave .name com valor mPulse e, em seguida, alterar o .options.apiKey desse elemento para algum outro valor:

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

Ou seja, reescreva o array .rules.behaviour de tal forma que o elemento cuja .name key seja mPulse obtenha um novo .options.apiKey .

    
por 16.10.2018 / 20:18
1

Um par de otimizações, não menos do que é evitar um "uso inútil de cat ". Você não precisa cat file | grep pattern ; você pode apenas grep pattern file . E como você é grep ping em awk , isso também pode ser simplificado:

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

torna-se

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

Agora, para o seu script sed . Você está usando Strong Quotes ( ' ) em torno do seu comando sed, o que significa que as variáveis do seu shell não serão analisadas. Você precisa usar Weak Quotes ( " ) para que isso funcione:

currentSchema="$( awk '/schema/ {print $3}' test.json )"
sed --in-place "s/$currentSchema/BBBBB/" test.json
    
por 16.10.2018 / 19:34
0

Você não precisa de grep , awk e sed para isso; awk pode fazer toda a tarefa (não testada):

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

Por favor, tente denunciar.

    
por 16.10.2018 / 19:28