Powershell: поиск строки в конце одной строки и начале следующей строки, а также номер выходной строки - PullRequest
0 голосов
/ 21 марта 2020

Как выполнить поиск, чтобы найти строку, содержащую только символ «тильда», за которой следует следующая строка, которая НЕ НАЧИНАЕТСЯ с символа ~ тильда.

Это для большого текстового файла с несколькими записями. и, как правило, каждая мульти-запись отделяется (разделяется) записью, содержащей только символ тильды. Я хотел бы найти все отсутствующие разделители в файле. Все записи в файле заканчиваются CRLF.

Пример текстового файла для поиска. В этом примере файла первая мульти-запись находится в строках 1 и 2, за которой следует разделитель тильды, затем строки 4–6 - это следующая мульти-запись, за которой следует еще один разделитель ~ в строке 7. Сценарий должен найти ошибку. в строке 8, поскольку она должна начинаться с ~, за которым следует дополнительный текст (как в строках 1 и 4).

MyTextFile.txt :

~A123~,~800-123-1234~,~800-345-6789~

SAMPLE TEXT HERE

~

~A100~,~800-123-1234~,~800-345-6789~

SAMPLE TEXT HERE

MORE SAMPLE TEXT HERE

~

SAMPLE TEXT HERE

MORE SAMPLE TEXT HERE

Следующее Код PowerShell находит «Значение», используя только тильду, за которой следует 1-й символ в следующей строке «S», но он не отображает номер строки, который мне нужен, поэтому я могу удалить оставшийся текст после строки ~.

Текущий код:

$MYFILE = Get-Content MyTextFile.txt -Raw
[regex]$rx="[~]`r`n[^~]"
$rx.Match($MYFILE) 

Вывод:

Groups   : {0}
Success  : True
Name     : 0
Captures : {0}
Index    : 136
Length   : 4
Value    : ~
           S

У меня есть рабочий скрипт в Linux BASH, но я новичок в Powershell.

1 Ответ

1 голос
/ 21 марта 2020

Вы можете использовать Select-String для этого:

Select-String -Path MyTextFile.txt -Pattern '^~$' -Context 1 | Foreach-Object {
    if ($_.Context.Postcontext -notmatch '^~') {
        throw "Error: Line $($_.LineNumber+1) is missing the delimiter"
    }
}

Объяснение:

Select-String может прочитать строку текстового файла -by-line с помощью команды -Path и выполнить сопоставление регулярных выражений на основе значения -Pattern. Использование -Context 1 возвращает строку выше и ниже каждого совпадения.

Возвращаемый объект - это MatchInfo объект со свойствами LineNumber (для сопоставленной строки) и Context. Context - это объект MatchInfoContext со свойствами PreContext (строка до совпадения) и PostContext (строка после совпадения).

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