WebHU - Programozási kérdések és válaszok

Hogyan lehet több karakterláncot kivonni két szó között

Powershell-t használok egy naplófájl tartalmának lekéréséhez. Egy ismeretlen karakterláncot próbálok kivonni két ismert szó közé. Ezt több sorhoz kell megtennem, így több karakterláncot akarok keresni és visszaadni. Sok példát láttam és többféle módszert is kipróbáltam, de nem működnek.

A reg ex-et használtam, hogy leszűkítsem a napló számomra fontos soraira, de nem tudom kibontani a kívánt szöveget.

$fails =  Select-String -Path 'C:\Users\user\Documents\wsyncmgr.log'  -Pattern "^(?=.*?\bError\b)(?=.*?\bSoftware\b)(?=.*?\bLicense\b)(?=.*?\bTerms\b)(?=.*?\bnot\b)(?=.*?\bdownloaded\b).*$"

ez adja vissza:

C:\Users\user\Documents\wsyncmgr.log:7340:Failed to sync update 817ad2a6-3ca7-4fa2-aa32-9b906a2d9fdc. Error: The Microsoft Software License Terms have not been completely 
downloaded and~~cannot be accepted. Source: Microsoft.UpdateServices.Internal.BaseApi.SoapExceptionProcessor.DeserializeAndThrow  $$<SMS_WSUS_SYNC_MANAGER><10-23-2019 
08:31:07.642+300><thread=5916 (0x171C)>
C:\Users\user\Documents\wsyncmgr.log:7341:Failed to sync update 87e13ecb-c669-43be-9e2a-01e567285031. Error: The Microsoft Software License Terms have not been completely 
downloaded and~~cannot be accepted. Source: Microsoft.UpdateServices.Internal.BaseApi.SoapExceptionProcessor.DeserializeAndThrow  $$<SMS_WSUS_SYNC_MANAGER><10-23-2019
08:31:07.643+300><thread=5916 (0x171C)>

stb..

Csak ki szeretném bontani a frissítés egyedi azonosítóját, hogy mindegyiket változóba helyezhessem, és később felhasználhassam.

$removeFirst = $fails -split "update " $removeLast = $removeFirst -split ". Error:" $removeLast[1] a legközelebb van hozzám

C:\Users\user\Documents\wsyncmgr.log:7341:Failed to sync 
87e13ecb-c669-43be-9e2a-01e567285031
 The Microsoft Software License Terms have not been completely downloaded and~~cannot be accepted. Source: Microsoft.UpdateServices.Internal.BaseApi.SoapExceptionProcessor.DeserializeAndThrow  $$<SMS_WSUS_SYNC_MANAGER><10-23-2019 08:31:07.643+300><thread=5916 (0x171C)>
C:\Users\user\Documents\wsyncmgr.log:7342:Failed to sync
c1a1ec21-8efc-4cd4-8e85-90a03fc7b0c8
 The Microsoft Software License Terms have not been completely downloaded and~~cannot be accepted. Source: Microsoft.UpdateServices.Internal.BaseApi.SoapExceptionProcessor.DeserializeAndThrow  $$<SMS_WSUS_SYNC_MANAGER><10-23-2019 08:31:07.644+300><thread=5916 (0x171C)>
C:\Users\user\Documents\wsyncmgr.log:7343:Failed to sync
09dc7113-fa44-4ca8-9d70-ec254d4d2f04
 The Microsoft Software License Terms have not been completely downloaded and~~cannot be accepted. Source: Microsoft.UpdateServices.Internal.BaseApi.SoapExceptionProcessor.DeserializeAndThrow  $$<SMS_WSUS_SYNC_MANAGER><10-23-2019 08:31:07.644+300><thread=5916 (0x171C)>

de ez csak az általam megadott szavakat távolítja el, a többit pedig külön sorba helyezi. akkor a tömb csak az általam megadott sort adja vissza, de többszöröst akarok. Mindent el akarok törölni az "update" előtt és mindent "az" után. Hiba:" minden sorhoz csak a "09dc7113-fa44-4ca8-9d70-ec254d4d2f04" marad.

minden segítséget szívesen vennék, ha nem jó a regex


  • A kissé félreérthető cím miatt érdemes megemlíteni: ha azt szeretné, hogy a Select-String több (minden) egyezést találjon egy sorban, adja hozzá a -AllMatches karakterláncot. 23.10.2019

Válaszok:


1

Ha az azonosítók szerkezete megegyezik, a következőket teheti:

$fails | Select-String '(?:[a-z0-9]+-){4}[a-z0-9]+' |
  ForEach-Object { $_.Matches.Value }

Magyarázat:

  • (?:[a-z0-9]+-) nem rögzítő csoport, amely egy vagy több alfanumerikus karakternek felel meg és --ra végződik
  • {4} négyszer egyezik
  • [a-z0-9]+ egy vagy több alfanumerikus karakternek felel meg.

Mivel több sor kerül rögzítésre, minden egyező sor egy MatchInfo objektum lesz. A Foreach-Object bemenet lehetővé teszi, hogy minden objektumot $_ néven érjünk el. A .Matches.Value csak az objektum egyezésének értékét fogja lekérni.

23.10.2019
  • Ez két sorral szebben formázza, de továbbra is nekem marad az összes naplósor. Mivel ez egy a számokból álló karakterlánc, lehetséges, hogy csak a kívánt számsort tartalmazza? Failed to sync update 817ad2a6-3ca7-4fa2-aa32-9b906a2d9fdc. Error: The Microsoft Software License Terms have not been completely downloaded and~~cannot be accepted. Source: Microsoft.UpdateServices.Internal.BaseApi.SoapExceptionProcessor.DeserializeAndThrow $$<SMS_WSUS_SYNC_MANAGER><10-23-2019 08:31:07.642+300><thread=5916 (0x171C)> 23.10.2019
  • ha a $fails tartalmazza az általad felsorolt ​​kimenetet a returns: alatt, akkor ennek működnie kell, és csak az azonosítókat jeleníti meg. 23.10.2019
  • Igen, uram, pontosan ezt adja vissza, és amikor lefuttatom a kódját, azt adja vissza, amit a megjegyzésekben írtam 23.10.2019
  • Látom, mit csináltál, azt hiszem, ezt a bitet a második találathoz készítetted, ahol a -spilt paramétert használtam a $fails változón. Amikor a kódot az általam létrehozott $removefirst változóba vezetem, az tökéletesen működik. köszönöm. 23.10.2019
  • Az én $fails az újsor karakterekkel elválasztott karakterláncok tömbje. Ha a $fails egyetlen karakterlánc, akkor hozzá kell adnia a -AllMatches paramétert a Select-String-hez. Alapvetően kimásoltam és beillesztettem, amit adtál. 23.10.2019
  • Valószínűleg ez egy hosszú karakterlánc, mivel a select-String -path ‹Log location› -pattern ^(?=.*?\bError\b)(?=.*?\bSoftware\b)(?=.*? \bLicenc\b)(?=.*?\bFeltételek\b)(?=.*?\bnot\b)(?=.*?\bletöltve\b).*$ egy .log fájlon, és az csak a hibákat tartalmazó sorok a $fails változóban. Amikor önmagában futtatom a kódot a naplófájlban, úgy működik, ahogy kellene, de minden egyes frissítést megragad a naplóban. A fails változó csak a hibákat tartalmazó sorokra szűkíti le. Még akkor is, ha hozzáadtam az -allmatches paramétert, akkor is visszaad mindent, amit eredetileg beillesztem a válaszomba. 24.10.2019
  • Ez a megoldás azon alapul, hogy Ön már végez némi szűrést. Ha azt szeretné, hogy az eredeti fájlra vonatkozzon, akkor a tényleges fájlból kell elküldenie a példasorokat 24.10.2019
  • Bármivel is jól vagyok, ami tényleg működik, de nem tudok beilleszteni annyi sort. 24.10.2019
  • Kihagyott c7596eab-52eb-43f3-9a0a-bc7b908a9683 frissítés – Biztonsági frissítés a Microsoft Office 2010 (KB4011610) 32 bites kiadáshoz, mert naprakész. $$‹SMS_WSUS_SYNC_MANAGER›‹10-10-2019 11:58:45.151+300›‹thread=21252 (0x5304)› Kihagyott frissítés a 8058136c-f813-28b7f8d Microsoft Office0 8058136c-f813-28b7f8 2010 (KB4011610) 64- Bit Edition, mert naprakész. $$‹SMS_WSUS_SYNC_MANAGER›‹10-10-2019 11:58:45.167+300›‹thread=21252 (0x5304)›....... De engem csak a vonalak érdekelnek 24.10.2019
  • :Nem sikerült szinkronizálni a 09dc7113-fa44-4ca8-9d70-ec254d4d2f04 frissítést. Hiba: A Microsoft szoftverlicenc feltételei nem teljesen csak az uuid a hibasorok között. 24.10.2019

  • 2

    Használja a [regex]::matches metódust a karakterláncon (meg kell adnia egy reguláris kifejezést az illeszkedéshez), majd ellenőrizze a visszaadott tömböt a karakterlánc minden egyes egyezésénél. Íme egy példa:

    $myString = "The quick brown fox"
    $myMatches = [regex]::matches($myString, "\w+")
    $myMatches.Value
    

    A fenti példa szavakat keres a karakterláncban. A matches metódus többszörösen egyezik, míg a -match operátornak nincs globális egyezési opciója (amit megtalálnék, szívesen bebizonyítanák, hogy itt tévednek). Az .Value tulajdonság tartalmazza a tényleges egyezést, bár vannak más hasznos tagok is, amelyeket a System.Text.RegularExpressions.Match objektumon is használhat.

    SZERKESZTÉS

    Kicsit félreérthető volt a kérdésed:

    • Egy ismeretlen karakterláncot próbálok kivonni két ismert szó közé.
    • Csak szeretném kibontani a frissítés egyedi azonosítóját

    Lemaradtam a második részről, szóval hadd szóljak itt róla. Mivel egy ismert mintát (egyedi azonosítót) szeretne kiválasztani egy karakterláncból, használhatja a -match operátort ehhez:

    $fails | Foreach-Object {
      if( $_ -match '[a-z0-9]{8}-([a-z0-9]{4}-){3}[a-z0-9]{12}') ){
        $matches[0]
    }
    

    A $matches egy speciális tömb, amely a -match operátorral történő egyeztetéskor a $matches 0 indexébe kerül. Minden index múlt, amely csoportmeccs rögzítését jelzi, de erre itt nincs szükség.

    Az általam megadott kifejezés egy jól formázott UUID-re vonatkozik, és működnie kell az MS regex motorral, valamint a PCRE-vel és a Javascript-tel is. Természetesen ügyeljen arra, hogy a kis- és nagybetűket figyelmen kívül hagyó egyezést használjon, vagy ha más esetekben szükséges, adja hozzá a nagybetűs változatokat.

    23.10.2019
  • Ez csak megragad mindent, amit keres, abból, amit tudok. Nem tudom a pontos karakterláncot, amit bele akarok venni. csak mindent, amit ki akarok zárni. 23.10.2019
  • Példa kifejezést adtam. Ehelyett beillesztheti saját kifejezését. Előfordulhat, hogy nem rögzítő csoportot kell használnia, ha csak bizonyos más minták után vagy előtt szeretne illeszkedni. 23.10.2019
  • Frissítettem a válaszomat további információkkal az UUID karakterláncból való kinyeréséről. 23.10.2019
  • Mi az a nem rögzítő csoport? 24.10.2019
  • Ezeket más minták előtti vagy utáni minták egyeztetésére használják. Íme egy SO kérdés, amely részletesebben magyarázza el a csoportokat. 24.10.2019
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..