powershell extrait de texte entre deux chaînes de caractères
Je sais que cette question a été posée mais je ne peux pas obtenir toutes les réponses que j'ai regardé au travail. J'ai un fichier JSON qui a des milliers de lignes et souhaitez simplement extraire le texte entre deux chaînes de caractères à chaque fois qu'ils apparaissent (ce qui est beaucoup).
Comme un simple exemple de mon JSON devrait ressembler à ceci:
"customfield_11300": null,
"customfield_11301": [
{
"self": "xxxxxxxx",
"value": "xxxxxxxxx",
"id": "10467"
}
],
"customfield_10730": null,
"customfield_11302": null,
"customfield_10720": 0.0,
"customfield_11300": null,
"customfield_11301": [
{
"self": "zzzzzzzzzzzzz",
"value": "zzzzzzzzzzz",
"id": "10467"
}
],
"customfield_10730": null,
"customfield_11302": null,
"customfield_10720": 0.0,
Je tiens donc à la sortie de tout ce qui est entre "customfield_11301" et "customfield_10730":
{
"self": "xxxxxxxx",
"value": "xxxxxxxxx",
"id": "10467"
}
],
{
"self": "zzzzzzzzzzzzz",
"value": "zzzzzzzzzzz",
"id": "10467"
}
],
Je suis en train de le garder aussi simple que possible - afin de ne pas les soins sur les supports affichée dans la sortie.
C'est ce que j'ai (qui sorties plus que ce que je veux):
$importPath = "todays_changes.txt"
$pattern = "customfield_11301(.*)customfield_10730"
$string = Get-Content $importPath
$result = [regex]::match($string, $pattern).Groups[1].Value
$result
- pourquoi ne pas décoder le JSON en objet et l'adresse de propriétés directement?
- La réponse rapide est - changer votre avides de capture
(.*)
non gourmand -(.*?)
. Cela devrait le faire. - Heureux, il a aidé. N'hésitez pas à marquer ma réponse ci-dessous comme acceptée.
Vous devez vous connecter pour publier un commentaire.
La réponse rapide - changez votre avides de capture
(.*)
non gourmand -(.*?)
. Cela devrait le faire.Sinon la capture de manger autant qu'il le peut, résultant en il continue jusqu'à la fin du dernier
customfield_10730
.Ce qui concerne
Vous avez besoin pour faire de votre RegEx Paresseux:
Démo en Direct sur Regex101
Votre Regex était Gourmand. Cela signifie qu'il va trouver
customfield_11301
, puis porter jusqu'à ce qu'il trouve le derniercustomfield_10730
.Ici est un exemple simple d'un Gourmand vs Paresseux Regex:
Votre Regex était très semblable à la première, il a capturé trop, alors que cette nouvelle capture le moins de données possible, et va donc travailler comme vous le souhaitez
Voici une PowerShell qui permet de rechercher une chaîne de caractères entre deux chaînes de caractères.
Vous pouvez ensuite exécuter la fonction comme ceci:
Mon test.txt le fichier contient le texte suivant à l'intérieur:
Donc mon résultat: