Usar uma substring do PowerShell para pesquisar dentro de uma string

Precisa procurar por uma sequência dentro de outra sequência? Não se preocupe, o substring do PowerShell está aqui! Neste artigo, eu te guio em como abandonar objetos e buscar dentro de sequências.

O substring do PowerShell

I love being on social media because I always come across something interesting related to PowerShell. Sometimes it is a trick I didn’t know about or a question someone is trying to figure out. I especially like the questions because it helps me improve my understanding of how people learn and use PowerShell. Workload permitting, I’m happy to jump in and help out.

Publicidade

Recentemente, um desafio se concentrou na análise de sequências. Embora você me ouça falar bastante sobre objetos no pipeline, não há nada de errado em analisar sequências se for isso que você precisa. Existem muitos arquivos de log por aí que precisam de análise, e o PowerShell pode ajudar.

Procurar por uma sequência em outra sequência

Neste caso, estou assumindo que algum tipo de arquivo de log está em jogo. Não sei como é o log completo nem qual é o objetivo geral. Tudo bem. Podemos aprender muito com a tarefa imediata. Digamos que você tenha uma sequência que se parece com isso:

Mailbox:9WJKDFH-FS349-1DSDS-OIFODJFDO-7F21-FC1BF02EFE26 (O'Hicks, Jeffery(X.))

I’ve changed the values a little bit and modified my name to make it more challenging. The goal is to grab the name from the string. I want to end up with:

O'Hicks, Jeffery(X.)

Há várias maneiras diferentes de realizar isso. A maneira certa provavelmente depende do seu nível de experiência com o PowerShell e do que mais você pode querer realizar. Vou começar atribuindo essa sequência à variável $s.

Publicidade

Usando o operador de separação do PowerShell

Quando me deparo com a análise de strings, às vezes ajuda dividir a string em componentes mais gerenciáveis. Para fazer isso, posso usar o operador split. Também há um método split para a classe string. Vou assumir que você vai dedicar um tempo depois para ler mais sobre PowerShell split.

$s -split "\s",2

O “\s” é um padrão de expressão regular que significa um espaço. O valor do parâmetro 2 indica que quero apenas duas substrings. Em outras palavras, dividir no primeiro espaço encontrado.

Using the split operator in Windows PowerShell. (Image Credit: Jeff Hicks)

I end up with an array of two elements. All I need is the second one.

$t = ($s -split "\s",2)[1]

Usando o método substring

Agora, para a diversão da análise, vamos usar o método SubString() do objeto string.

Publicidade

$t.Substring(1,$t.length-2)

I am telling PowerShell to get part of the string in $t, starting at character position 1 and then getting the next X number of characters. In this case, X is equal to the length of the string, $t, minus 2. This has the net effect of stripping off the outer parentheses.

Using the PowerShell substring method (Image Credit: Jeff Hicks)

Aqui está uma variação, onde faço a divisão no caractere “(”.

($s -split "\(",2)
$t = ($s -split "\(",2)[1]
$t.Substring(0,$t.length-1)
Using the split operator on a character in Windows PowerShell. (Image Credit: Jeff Hicks)

A diferença é que isso elimina o parêntese inicial. Então, tudo que preciso fazer é pegar tudo até o último caractere. A propósito, se você olhar um objeto string com Get-Member, verá alguns métodos Trim. Estes são para remover espaços em branco iniciais e/ou finais. Esses métodos não se aplicam aqui.

Dividir uma string usando números de índice de array

Existe mais uma maneira de dividir uma string que você pode achar útil. Você pode tratar todas as strings como um array de caracteres. Isso significa que você pode usar números de índice de array para referenciar elementos específicos.

Contar elementos em um array começa em 0. Se você executar $t[0], obterá o primeiro elemento do array, neste caso ‘O’. Você também pode usar o operador de intervalo.

$t[0..5]
An alternative to splitting a string in Windows PowerShell. (Image Credit: Jeff Hicks)

Neste momento, $t tem um ) extra no final que eu não quero. Preciso pegar tudo até o segundo elemento do final.

$t[0..($t.length-2)]

Isso me dará um array exibido verticalmente, como você pode ver na captura de tela acima. Dito isso, é fácil juntar a string cortada novamente.

-join $t[0..($t.length-2)]

Pode parecer um pouco estranho começar com um operador, mas se você ler sobre _join, então verá que esta é uma abordagem válida que funciona.

Using the -join operator to put our string back together. (Image Credit: Jeff Hicks)

Função simples para análise de strings

I’m assuming you want an easy way to do this type of parsing, so I wrote a simple function.

Function Optimize-String {
[cmdletbinding()]
Param(
[Parameter(Position=0,Mandatory,HelpMessage="Enter a string of text")]
[ValidateNotNullorEmpty()]
[string]$Text,
[int]$Start=0,
[int]$End=0
)
#trim off spaces
$string = $Text.Trim()
#get length value when starting at 0
$l = $string.Length-1
#get array elements and join them back into a string
-join $string[$Start..($l-$end)]
} #end function

A função recebe uma string de texto e retorna a substring menos X número de caracteres do início e X número de caracteres do final. Agora tenho um comando fácil para analisar strings.

Using the optimize-string function in Windows PowerShell. (Image Credit: Jeff Hicks)

Se você olhar através do código, então verá que estou usando o método Trim(). Estou usando porque não quero que espaços extras no início ou no final da string sejam incluídos.

Voltando à minha variável de string original, agora posso analisá-la com um comando de uma linha:

optimize-string ($s -split("\s",2))[1] -Start 1 -end 1
Using the optimize-string function to search inside a string (Image Credit: Jeff Hicks)

Se fizer mais sentido para você dividir isso em etapas separadas, tudo bem.

$arr = $s -split("\s",2)
$text =  $arr[1]
optimize-string $text -Start 1 -end 1

Da próxima vez, veremos a análise de strings usando expressões regulares, e não será assustador, eu prometo.

Source:
https://petri.com/powershell-substring/