Могу ли я использовать Powershell для автоматического извлечения неизвестной строки с определенным шаблоном из файла XML и записи этой строки в текстовый файл? - PullRequest
0 голосов
/ 11 мая 2019

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

То, что содержит строка, неизвестно и может варьироваться, но шаблон тот же. Например:

12hi34

99ok45

Общее у них то, что длина равна 6 и элемент:

0-1: целые числа

2-3: символы

4-5: целые числа

Есть ли способ использовать Powershell и написать скрипт, который может найти строку, соответствующую образцу, и экспортировать ее в текстовый файл?

Я новичок в Powershell и сценариях. Попробовал в Google проблему и наткнулся на Select-String, но это не решает мою проблему. Надеюсь, что некоторые из вас могут направить меня сюда. Спасибо.

Редактировать: строка находится за пределами корневого элемента в виде некоторого "свободного текста". Это не традиционный файл XML.

Ответы [ 2 ]

0 голосов
/ 11 мая 2019

Предполагается, что в файле есть только один маркер, представляющий интерес, и что буквы ограничены английскими буквами от 'a' до 'z':

(Get-Content -Raw in.xml) -replace '(?s).*(\d{2}[a-z]{2}\d{2}).*', '$1' > out.txt

Примечание:

  • Если соответствующий токен не найден, весь контент входного файла записывается в out.txt.

  • В Windows PowerShell > по умолчанию создает файлы UTF-16LE ("Unicode") (в PowerShell Core это UTF-8 без спецификации); вместо Set-Content out.txt -Encoding ... вместо этого создайте файл с другой кодировкой.

  • Get-Content -Raw читает весь входной файл как одну строку.

  • Оператор -replace использует регулярные выражения (регулярные выражения) для сопоставления - см. этот ответ для получения дополнительной информации.

    • Встроенный параметр (?s) в начале регулярного выражения также делает . совпадением с символами новой строки.
    • По умолчанию соответствие регистр- в чувствительно; используйте -creplace для регистров- чувствительных соответствий.
0 голосов
/ 11 мая 2019

Попробуйте это ...

$f = Get-Content '<xml-file>' -ReadCount 0
foreach ($l in $f) {
    if ($l -match '[0-9]{1,3}[a-zA-Z]{2,3}[0-9]{1,5}') {
        Write-Output $matches.0
    }
}

Заполнение содержимого файла в переменную. Итерация по каждой строке файла. Разбор значения по шаблону.

Вот образец подходящей фигуры ...

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...