2010-06-07 15 views
23

¿Cómo puedo extraer una subcadena usando PowerShell?Extienda una subcadena usando PowerShell

tengo esta cadena ...

"-----start-------Hello World------end-------" 

tengo que extraer ...

Hello World 

¿Cuál es la mejor manera de hacerlo?

Respuesta

13

El método Substring nos proporciona una forma de extraer una cadena particular de la cadena original en función de una posición y longitud de inicio. Si solo se proporciona un argumento, se toma como la posición de inicio y el resto de la cadena se emite.

PS > "test_string".Substring(0,4) 
Test 
PS > "test_string".Substring(4) 
_stringPS > 

link text

Pero esto es más fácil ...

$s = 'Hello World is in here Hello World!' 
$p = 'Hello World' 
$s -match $p 

Y, por último, a través de un directorio recursivamente seleccionando sólo los archivos .txt y búsqueda de ocurrencia de "Hello World":

dir -rec -filter *.txt | Select-String 'Hello World' 
+2

+1: sin embargo una expresión regular la captura de cuál entre las etiquetas de inicio y fin sería mejor, por ejemplo, "----- start ------- (. +?) ------ end -------" (expresión regular no probada, y no soy un gurú regex) –

26

El operador -match prueba una expresión regular, se combina con la variable mágica $matches para obtener su resultado

PS C:\> $x = "----start----Hello World----end----" 
PS C:\> $x -match "----start----(?<content>.*)----end----" 
True 
PS C:\> $matches['content'] 
Hello World 

En caso de duda acerca de las cosas de expresiones regulares-y, echa un vistazo a este sitio: http://www.regular-expressions.info

+4

No tuve ¡pista haciendo regex en PowerShell era así de simple! ¡¡¡Muchas gracias!!! – xdhmoore

+0

expresión regular en PowerShell es increíble. –

+0

Cuando intento esto, no veo "verdadero", pero la línea completa está probando esto en una varible de línea múltiple (salida de ping). Entonces, haciendo un único ping y guardando la respuesta, solo quiero buscar esta línea "Reply from 149.155.224.1: bytes = 32 time <1ms TTL = 128" y extraer la dirección IP. ¿Tienes alguna idea? – DevilWAH

2

Sobre la base de la respuesta de Matt, aquí está uno que busca a través de los saltos de línea y es fácil de modificar para su propio uso

$String="----start----`nHello World`n----end----" 
$SearchStart="----start----`n" #Will not be included in results 
$SearchEnd="`n----end----" #Will not be included in results 
$String -match "(?s)$SearchStart(?<content>.*)$SearchEnd" 
$result=$matches['content'] 
$result 

-

NOTA: re Si desea ejecutar esto en contra de un archivo de tener en cuenta Get-Content convierte una matriz no una sola cadena. Puede solucionar esto haciendo lo siguiente:

$String=[string]::join("`n", (Get-Content $Filename)) 
+0

más fácil de usar -raw o simplemente lea el archivo usando.Métodos NET – 4c74356b41

-2

Dado que la cadena no es compleja, no es necesario agregar cadenas RegEx. Un simple partido hará el truco

$line = "----start----Hello World----end----" 
$line -match "Hello World" 
$matches[0] 
Hello World 

$result = $matches[0] 
$result 
Hello World 
+6

Extraer una cadena conocida no tiene sentido, ya que ya conoce la cadena. – Swonkie

1

otra solución

$template="-----start-------{Value:This is a test 123}------end-------" 
$text="-----start-------Hello World------end-------" 

$text | ConvertFrom-String -TemplateContent $template 
+0

Mind blown. PowerShell tiene funciones locas –

1
PS> $a = "-----start-------Hello World------end-------" 
PS> $a.substring(17, 11) 
     or 
PS> $a.Substring($a.IndexOf('H'), 11) 
+0

$ a.Substring (argumento1, argumento2) - Aquí argumento1 = Posición de inicio del alfabeto deseado y argumento2 = Longitud de la subcadena que desea como salida. Aquí 17 es el índice del alfabeto 'H' y como queremos imprimir hasta Hello World, proporcionamos 11 como el segundo argumento. –

3

No estoy seguro si esto es eficiente o no, pero las cadenas en PowerShell se puede hacer referencia a la utilización de la sintaxis índice de matriz, en una manera similar a Python.

No es completamente intuitiva por el hecho de la primera letra es referido por index = 0, pero sí:

  • permitir que un segundo número de índice que es más larga que la cadena, sin generar un error
  • Extraer subcadenas a la inversa
  • Extraer subcadenas de la final de la cadena

H ERE son algunos ejemplos:

PS > 'Hello World'[0..2] 

produce el resultado (valores de índice incluyen para mayor claridad - no se generan en la salida):

H [0] 
e [1] 
l [2] 

que se pueden hacer más útil haciendo pasar -join '':

PS > 'Hello World'[0..2] -join '' 
Hel 

Hay algunos efectos interesantes que puede obtener mediante el uso de diferentes índices:

Delanteros

Utilice un primer valor de índice que es menor que la segunda y la subcadena será extraído en la dirección hacia delante como era de esperar. En esta ocasión el segundo valor del índice es muy superior a la longitud de la cadena, pero no hay error:

PS > 'Hello World'[3..300] -join '' 
lo World 

A diferencia:

PS > 'Hello World'.Substring(3,300) 
Exception calling "Substring" with "2" argument(s): "Index and length must refer to a location within 
the string. 

revés

Si proporciona un segundo valor de índice que es menor que la primera, la cadena se devuelve en reversa:

PS > 'Hello World'[4..0] -join '' 
olleH 

De Fin

Si utiliza los números negativos se puede hacer referencia a una posición desde el final de la cadena. Para extraer 'World', los últimos 5 letras, utilizamos:

PS > 'Hello World'[-5..-1] -join '' 
World 
Cuestiones relacionadas