Eu tenho um json como abaixo:
[
{
"name": "architecture-design-detailed",
"rootPath": "/media/ismail/architecture-design-detailed/_Working/_NotesFiltered/_software/architecture-design-detailed",
"paths": [],
"group": "",
"enabled": true
},
{
"name": "architecture-design-detailed-engineering",
"rootPath": "/media/ismail/architecture-design-detailed/_Working/_NotesFiltered/_software/architecture-design-detailed-engineering",
"paths": [],
"group": "",
"enabled": true
}
]
Se o nome for architecture-design-detailed
,
mudar o nome para
new_name_here
substitua a última parte de rootPath (que é detalhada no design da arquitetura, após o último /) por new_name_here.
Portanto, a saída esperada é:
[
{
"name": "new_name_here",
"rootPath": "/media/ismail/architecture-design-detailed/_Working/_NotesFiltered/_software/new_name_here",
"paths": [],
"group": "",
"enabled": true
},
{
"name": "architecture-design-detailed-engineering",
"rootPath": "/media/ismail/architecture-design-detailed/_Working/_NotesFiltered/_software/architecture-design-detailed-engineering",
"paths": [],
"group": "",
"enabled": true
}
]
O que eu descobri até agora é:
jq 'map(if .name == "architecture-design-detailed" then .name = "new_name_here" else . end)'
Mas não entendo como substituir a última parte do rootPath. Acho que temos que usar sub
or gsub
. Mas não entendendo como.
Você pode usar
split("/")
para converterrootPath
em um array, depois definir o último índice (.[-1]
) paranew_name
e depoisjoin("/")
juntá-los novamente.Usamos
|=
insidemap()
apenas para atualizar os objetos encontradosselect()
e, em seguida, sobrescrever.name
conformerootPath
necessário.Demonstração do JqPlay
Para atingir seu objetivo com jq, você realmente precisa usar a subfunção para substituir a última parte de rootPath quando o nome corresponder a "arquitetura-design-detalhado". Seu filtro jq precisa ser expandido para também modificar condicionalmente o rootPath, além de alterar o nome.
Saída:
]
Aqui está outra abordagem que atualiza de uma só vez os dois campos
.name, .rootPath
para itens selecionados correspondentes.name == $from
, cortando à direita o nome antigo usandortrimstr($from)
e adicionando o novo com+ $to
: