Извлечь подстроку с помощью PowerShell - PullRequest
40 голосов
/ 07 июня 2010

Как извлечь подстроку с помощью PowerShell?

У меня есть эта строка ...

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

Я должен извлечь ...

Hello World

Какой лучший способ сделать это?

Ответы [ 8 ]

41 голосов
/ 19 августа 2010

Оператор -match проверяет регулярное выражение, комбинируя его с магической переменной $matches, чтобы получить ваш результат

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

Если у вас есть сомнения по поводу регулярных выражений, посетите этот сайт: http://www.regular -expressions.info

33 голосов
/ 09 июня 2010

Метод Substring предоставляет нам способ извлечь конкретную строку из исходной строки на основе начальной позиции и длины. Если указан только один аргумент, он принимается за начальную позицию, а остаток строки выводится.

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

текст ссылки

Но это проще ...

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

И, наконец, пройти через каталог, выбрав только файлы .txt и выполнив поиск "Hello World":

dir -rec -filter *.txt | Select-String 'Hello World'
10 голосов
/ 21 июня 2017

Не уверен, является ли это эффективным или нет, но на строки в PowerShell можно ссылаться с использованием синтаксиса индекса массива, аналогично Python.

Это не полностью интуитивно понятно из-за того факта, что первая буква упоминается index = 0, но это так:

  • Разрешить второй порядковый номер, который длиннее строки, без генерации ошибки
  • Извлечение подстрок в обратном порядке
  • Извлечение подстрок из конца строки

Вот несколько примеров:

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

Возвращает результат (значения индекса включены для ясности - не генерируются в выходных данных):

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

Что можно сделать более полезным, передав -join '':

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

Есть несколько интересных эффектов, которые вы можете получить, используя разные индексы:

Нападающие

Используйте первое значение индекса, которое меньше второго, и подстрока будет извлечена в прямом направлении, как и следовало ожидать. На этот раз второе значение индекса намного превышает длину строки, но ошибки нет:

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

В отличие:

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

Backwards

Если вы предоставите второе значение индекса, которое меньше первого, строка возвращается в обратном порядке:

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

С конца

Если вы используете отрицательные числа, вы можете ссылаться на позицию от конца строки . Чтобы извлечь 'World', последние 5 букв мы используем:

PS > 'Hello World'[-5..-1] -join ''
World
5 голосов
/ 27 февраля 2017
PS> $a = "-----start-------Hello World------end-------"
PS> $a.substring(17, 11)
         or
PS> $a.Substring($a.IndexOf('H'), 11)

$a.Substring(argument1, argument2) -> Здесь argument1 = Начальная позиция нужного алфавита и argument2 = Длина подстроки, которую вы хотите вывести.

Здесь 17 - индекс алфавита 'H', и поскольку мы хотим печатать до Hello World, мы предоставляем 11 в качестве второго аргумента

3 голосов
/ 29 января 2017

другое решение

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

$text | ConvertFrom-String -TemplateContent $template
3 голосов
/ 04 мая 2012

Опираясь на ответ Мэтта, вот тот, который ищет новые строки и его легко изменить для собственного использования

$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

-

ПРИМЕЧАНИЕ: если вы хотите запустить это для файла, имейте в виду, что Get-Content возвращает массив, а не одну строку. Вы можете обойти это, выполнив следующие действия:

$String=[string]::join("`n", (Get-Content $Filename))
0 голосов
/ 20 августа 2018

Мне нужно было извлечь несколько строк в лог-файл, и этот пост помог мне решить мою проблему, поэтому я подумал добавить его сюда. Если кому-то нужно извлечь несколько строк, вы можете использовать скрипт, чтобы получить индекс слова, соответствующего этой строке (я ищу «Корень»), и извлечь содержимое во всех строках.

$File_content = Get-Content "Path of the text file"
$result = @()

foreach ($val in $File_content){
    $Index_No = $val.IndexOf("Root")
    $result += $val.substring($Index_No)
}

$result | Select-Object -Unique

Ура! .. * * 1004

0 голосов
/ 29 мая 2014

Поскольку строка не является сложной, нет необходимости добавлять строки RegEx. Простое совпадение сделает свое дело

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

$result = $matches[0]
$result
Hello World
...