поиск шаблона из файла с комбинацией определенной переменной и дополнительных строк с использованием powershell

У меня есть текстовый файл, как указано ниже:

    04Jul@15:08 ERROR: The Ticket and Load data do not match: NUM[MXS035] 
    04Jul@15:14 No data for MXS035
    04Jul@15:14 Ticket = [MXS035]
    04Jul@15:39 Ticket = [ABC077]
    04Jul@16:14 gNoRcomp = [72]
    04Jul@16:14 Test lines 12345
    04Jul@16:14 gNoRcomp = [72]
    04Jul@16:14 test file content not displayed
    MU: module rpt3.cpp, line 8652
    Database 0
    Communications 0

Я создал значение $date, которое фиксирует общую часть текстового файла 04Jul для определенной даты, используя переменную

    $date_value=Get-date -Format ddMMM

при отображении значения $date_value мы получаем 04Jul. Мне нужно найти шаблон, который находится в текстовом файле, в котором дата является общей, а рабочий билет - обычным. Остальные значения в строке меняются.

пример :

Мне нужно захватить строки ниже:

    04Jul@15:14 Ticket = [MXS035]
    04Jul@15:39 Ticket = [ABC077]

Это 04Jul, которое уже захвачено в переменной $date_value@, и время изменяется, и «Билет = [» снова является общим, следующие 6 символов меняются, а последний ] является общим, которые не меняются.

Таким образом, требование

    [email protected]=[......]

вышеупомянутая часть является общей в строке текстового файла, которую необходимо захватить.

Я попробовал строку выбора ниже и не работает.

    select-string -pattern "$date_value@\d+:\d+ Ticket = [[]ABCDEF[]]" test.txt

Любые предложения, пожалуйста?


person user2075017    schedule 04.07.2013    source источник


Ответы (3)


Вам нужно изменить часть регулярного выражения, где вы ищете ссылку в квадратных скобках.

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

Следующие работы:

select-string -pattern "$date_value@\d+:\d+ Ticket = \[[A-Za-z]{3}\d{3}\]" test.txt

Итак, до ссылки в квадратных скобках все было в порядке. То, что я сделал здесь, говорит ему искать открывающую квадратную скобку, за которой следуют 3 буквы в верхнем или нижнем регистре, затем 3 цифры и, наконец, закрывающая квадратная скобка.

В моем тесте с файлом, использующим предоставленное вами содержимое, я получил следующие результаты:

test.txt:3:04Jul@15:14 Ticket = [MXS035]
test.txt:4:04Jul@15:39 Ticket = [ABC077]

... который сообщает вам имя файла, номер совпадающей строки и содержимое строки.

Для получения дополнительной помощи в командном окне Powershell или графическом интерфейсе ISE введите: help about_regular_expressions

person Graham Gold    schedule 04.07.2013

это пример регулярного выражения для такой строки: "04Jul@15:14 Ticket = [MXS035]"

"04Jul@15:14 Ticket = [MXS035]" -Match "(\d{2}\w{3})@(\d{2}:\d{2})\sTicket\s=\s\[(\w*)\]"
$date = ($Matches[1] | Get-date -Format ddMMM)
$time = $Matches[2]
$ticket = $Matches[3]
$date, $time, $ticket

этот код выберет все строки, соответствующие шаблону

Select-String -Pattern "(\d{2}\w{3})@(\d{2}:\d{2})\sTicket\s=\s\[(\w*)\]" test.txt

с переменной датой

$date_value='04Jul'
Select-String -Pattern $date_value+"@\d{2}:\d{2}\sTicket\s=\s\[\w*\]" "C:\test.txt"
person sqladmin    schedule 04.07.2013
comment
извините, я не мог получить ваш ответ. Не могли бы вы помочь мне с командой, которую нужно использовать, чтобы я мог попробовать и проверить? - person user2075017; 04.07.2013
comment
прежде всего скопируйте эту команду в инструмент powershell, который вы используете, и запустите его. - person sqladmin; 04.07.2013
comment
если вам нужно только найти строки, соответствующие шаблону, просто используйте правильный шаблон в команде select-string: Select-String -Pattern (\d{2}\w{3})@(\d{2}:\d{ 2})\sБилет\s=\s[(\w*)] test.txt - person sqladmin; 04.07.2013
comment
меня беспокоит команда select-string, которой нет в приведенном выше коде, который вы дали, а также более запутанная вещь заключается в том, что дата и время в строке, которая использовалась, меняются в моем текстовом файле каждый день и каждый раз ... так что первая строка совпадения не всегда постоянна. Пожалуйста, принимайте любые предложения. - person user2075017; 04.07.2013
comment
но если вы хотите по каким-то причинам поместить значения даты и номера тикета в переменные - тогда вы можете использовать для этого команду -Match и объект $Matches - person sqladmin; 04.07.2013
comment
В командной строке вы указали Select-String -Pattern (\d{2}\w{3})@(\d{2}:\d{2})\sTicket\s=\s[(\w*) ] моя переменная $date_value не используется. Если она не используется, я подозреваю, что все строки для разных дат также извлекаются командной строкой. - person user2075017; 04.07.2013
comment
этот шаблон для даты: (\d{2}\w{3}) в других строках нет слова "Билет =" - так что не волнуйтесь - просто попробуйте - person sqladmin; 04.07.2013
comment
извините за непонимание даты)) - я добавил новый код - person sqladmin; 04.07.2013

В вашем шаблоне измените [[]ABCDEF[]] на \[[A-Z]{3}[0-9]{3}\], чтобы он соответствовал номеру билета, состоящему из 3 прописных букв, за которыми следуют 3 цифры в буквальных квадратных скобках:

$date_value = Get-date -Format ddMMM
Select-String "$date_value@\d+:\d+ Ticket = \[[A-Z]{3}[0-9]{3}\]" test.txt

Это дает мне следующий результат, когда я использую его в файле test.txt с образцом содержимого из вашего вопроса:

test.txt:3:04Jul@15:14 Ticket = [MXS035]
test.txt:4:04Jul@15:39 Ticket = [ABC077]
person Ansgar Wiechers    schedule 04.07.2013
comment
Когда я попытался выполнить вышеизложенное, я не получаю никакого вывода на экран, курсор переходит к следующей строке для новой команды. PS D:\Temp\Arun› select-string -pattern $date_value@\d+:\d+ Ticket = [[A-Z]{3} [0-9]{3}] test.txt PS D:\Temp\Arun› - person user2075017; 04.07.2013
comment
Вы не избежали внешних квадратных скобок. Сравните свое выражение с выражением в моем ответе. - person Ansgar Wiechers; 04.07.2013