0
votes

Sed comment remplacer la chaîne de regex

J'ai une corde comme

"Solrhost": "http: // localhost: 8983, http: // localhost: 8764", dans un fichier appelé sampple.json. Il pourrait y avoir de l'espace entre "Solrhost" et: ou peut-être pas, et il pourrait y avoir de l'espace entre: et " http: // localhost: 8983, http: // localhost: 8764 "

J'ai une autre variable newservername = "http: // newerver, http: // newererver2"

la valeur de Solrhost pourrait être n'importe quoi entre les citations doubles,

Je veux remplacer la valeur de Solrhost d'Old à NewserverName à l'aide de SED Can quelqu'un m'aidez ici?


1 commentaires

Règle 1 du travail avec JSON: Utilisez un outil qui comprend le format, comme JQ .


3 Réponses :


-1
votes

Utilisez la commande SED ci-dessous pour remplacer le texte.

%s/solrHost(old name)/newServerName/g


0 commentaires

2
votes

Vous êtes beaucoup, beaucoup mieux à utiliser un outil qui comprend JSON au lieu d'essayer de regrouper quelque chose avec SED et des expressions régulières. JQ est la manipulation de ligne de commande de JSON: < Pré> xxx


2 commentaires

@ Davidc.rankin je me demande s'il y a une réponse aussi bonne que le classique " N'utilisez pas d'expressions régulières pour analyser XML " un pour JSON ...


Je pense que cela couvre. Mais vous obtenez des questions originales qui ne sont pas JSON, mais vous ressemblez beaucoup à eux. Quoi qu'il en soit avec ces fichiers formatés originaires de JSON, vous jouez essentiellement de la roulette russe sans quelque chose comme JQ au format et validera les résultats.



1
votes
sed 's%\("solrHost"[[:space:]]*:[[:space:]]*\)"[^"]*"%\1"'"$newServerName"'"%'

Use single quotes around most of the script.
Use % instead of / to mark the sections of the s/// (or s%%%) command.
Use [[:space:]]* to cover zero or more characters in the space class.  Replace with just a blank-star if you don't care about the alternatives (tabs, etc), which is probably justifiable with well-formed JSON.
Capture the original "solrHost" part.
Be very careful with the quotes in the replacement.


"'"$newServerName"'"
The first double quote will appear in the replacement text.
The first single quote terminates the current single-quoted string.
The second double quote starts a new double-quoted string.
The replacement variable is next.
The third double quote ends the double-quoted string.
The second single quote starts a new (and rather short) single-quoted string.
The fourth double quote will appear in the replacement text.


2 commentaires

Cela dépend davantage de la mise en page des champs. Les chances sont que ce serait bien, mais si le JSON est sur une seule ligne, le code plus simple pourrait remplacer les mauvaises informations alors que le code certes plus complexe dans la réponse ne ferait pas cette erreur.


Vous êtes correct et vous auriez certainement besoin des différents délimiteurs de substituts alternatifs, par ex. sed '/ ^ "SOLRHOST" / s @ "http. * $ @'" $ newserverName "@ '