Как извлечь подстроку с помощью PowerShell?
У меня есть эта строка...
"-----start-------Hello World------end-------"
Мне нужно извлечь...
Hello World
Каков наилучший способ сделать это?
Как извлечь подстроку с помощью PowerShell?
У меня есть эта строка...
"-----start-------Hello World------end-------"
Мне нужно извлечь...
Hello World
Каков наилучший способ сделать это?
Оператор -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
Метод 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'
Не уверен, является ли это эффективным или нет, но на строки в 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
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 в качестве второго аргумента
Основываясь на ответе Мэтта, здесь, который просматривает новые строки и легко модифицируется для вашего собственного использования.
$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))
другое решение
$template="-----start-------{Value:This is a test 123}------end-------"
$text="-----start-------Hello World------end-------"
$text | ConvertFrom-String -TemplateContent $template
Мне нужно было извлечь несколько строк в файл журнала, и этот пост был полезен для решения моей проблемы, поэтому я подумал добавить его здесь. Если кому-то нужно извлечь несколько строк, вы можете использовать скрипт, чтобы получить индекс слова, соответствующего этой строке (я ищу "Корень"), и извлечь содержимое во всех строках.
$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
Ура!..
Поскольку строка не является сложной, не нужно добавлять строки RegEx. Простой матч сделает трюк
$line = "----start----Hello World----end----"
$line -match "Hello World"
$matches[0]
Hello World
$result = $matches[0]
$result
Hello World