Как Вы извлекаете значение regex обратной ссылки/соответствия в Powershell

Если я правильно понимаю ваш вопрос, то получается то, что вы хотите:

$ echo "AA" | xxd -b | sed -E 's/ 0|  .*//g'
00000000:100000110000010001010

Ключевое изменение здесь - это использование двух пробелов перед .*, так что это соответствует только той части, которую вы хочу удалить.

В качестве альтернативы, мы можем сначала удалить пустой ноль:

$ echo "AA" | xxd -b | sed -E 's/ 0//g; s/ .*//'
00000000:100000110000010001010
19
задан d4nt 5 March 2009 в 12:57
поделиться

7 ответов

Я не знаю, почему Ваша версия не работает. Это должно работать. Вот более ужасная версия, которая работает.

$p = "subject=([A-Z\.]+),"
select-string -path *.txt -pattern $p | % {$_ -match $p > $null; $matches[1]}

Объяснение:

-match оператор соответствия регулярного выражения:

>"foobar" -match "oo.ar"
True

> $null просто подавляет Истинное, записанное в вывод. (Попытайтесь удалить его.) Существует cmdlet, который делает то же самое, имя которого я не вспоминаю в данный момент.

$matches волшебная переменная, которая содержит результат последнего -match операция.

11
ответ дан 30 November 2019 в 04:33
поделиться

Узнав много из всех других ответов, я смог получить то, что я хочу использовать следующую строку:

gci *.txt | gc | %{ [regex]::matches($_, "subject=([A-Z\.]+),") } | %{ $_.Groups[1].Value }

Это чувствовало себя прекрасно, поскольку я только выполнял regex однажды на строку и поскольку я вводил это в командной строке, было хорошо не иметь несколько строк кода.

2
ответ дан 30 November 2019 в 04:33
поделиться

Проблема с кодом, который Вы вводите, состоит в том, что избранная строка не передает фактический объект Regex. Вместо этого это передает другой класс под названием MatchInfo, который не имеет фактической информации соответствий regex.

Если Вы только хотите выполнить regex однажды, необходимо будет прокрутиться, Вы - собственная функция, которая не является слишком трудной.

function Select-Match() {
  param ($pattern = $(throw "Need a pattern"), 
         $filePath = $(throw "Need a file path") )
  foreach ( $cur in (gc $filePath)) { 
    if ( $cur -match $pattern ) { 
      write-output $matches[0];
    }
  }
}

gci *.txt | %{ Select-Match "subject=([A-Z\.]+)," $_.FullName }
1
ответ дан 30 November 2019 в 04:33
поделиться

Еще одна опция

gci *.txt | foreach { [regex]::match($_,'(?<=subject=)([^,]+)').value }
3
ответ дан 30 November 2019 в 04:33
поделиться

См. эти примечания по Регулярным выражениям в PowerShell

1
ответ дан 30 November 2019 в 04:33
поделиться

Закомите состояние открытых / закрытых строк в формате строки запроса (например, «Open = ROW1 + ROW5 + ROW10») и пропустите эту строку в URL-адреса в недавно открытое окно (например, «Host.com/blah.html) ? Open = Row1 + ROW5 + ROW10 "). На целевой странице в функции onload осмотрите объект местоположения и разверните эти ряды еще раз.

-121--3003442-

В PowerShell V2 CTP3 свойство совпадения реализована. Так что следующее будет работать:

select-string -path *.txt -pattern "subject=([A-Z\.]+)," | %{ $_.Matches[0].Groups[1].Value }
5
ответ дан 30 November 2019 в 04:33
поделиться

Другой вариант, сопоставление 7 цифр в строке

echo "123456789 hello test" | % {$_ -match "\d{7}" > $null; $matches[0]}

Возврат: 1234567

0
ответ дан 30 November 2019 в 04:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: