Извлечь подстроку с помощью PowerShell

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

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

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

Мне нужно извлечь...

Hello World

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

Ответ 1

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

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

Всякий раз, когда вы сомневаетесь в вещах regex-y, посмотрите этот сайт: http://www.regular-expressions.info

Ответ 2

Метод 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'

Ответ 3

Не уверен, является ли это эффективным или нет, но на строки в 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.

задом

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

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

С конца

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

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

Ответ 4

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 в качестве второго аргумента

Ответ 5

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

$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))

Ответ 6

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

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

$text | ConvertFrom-String -TemplateContent $template

Ответ 7

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

$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

Ура!..

Ответ 8

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

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

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