Удалить все строки после указанной c строки в PowerShell - PullRequest
1 голос
/ 18 февраля 2020

У меня есть .txt файл

ROTHSCHILD  = 81;        // Fondation Adolphe de Rothschild          ,                          2019
ONCOPOLE    = 82;        // Oncopole - Toulouse                      ,                          2019
GHRMSA      = 83;        // GHR  Mulhouse Sud-Alsace                 ,                          2019
CHDN        = 84;        // CH   du Nord - Luxembourg                ,                          2019
CAEN        = 85;        // CHU  de Caen                             ,                          2019
MONTELIMAR  = 86;        //                                          ,                          2019
PUYENVELAY  = 87;        //                                          ,                          2019

Я хочу удалить все строки после

CHDN        = 84;        // CH   du Nord - Luxembourg                ,                          2019

Как я могу это сделать?

Я пробовал это:

get-content txt.txt | % {$_ ; if($_ -eq "CHDN        = 84;        // CH   du Nord - Luxembourg                ,                          2019") {break }}

но сломайте мою программу, как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 18 февраля 2020

Скорее всего, вам нужно будет что-то проверять каждый раз. Я бы использовал Do..Until l oop вот так:

$txtData = get-content txt.txt
$stophere = 'CHDN        = 84;        // CH   du Nord - Luxembourg                ,                          2019'
$ctr = 0
Do
{
    $txtData[$ctr++] #Prints data line and increments counter
} Until ($txtData[$ctr] -eq $stophere)

Надеюсь, это поможет вам. Если да, примите этот ответ, используя галочку слева.

1 голос
/ 19 февраля 2020

но break заканчивает мою программу

Причина в том, что break в конвейере не выходит из конвейера, он выходит любые включающие l oop (foreach, for, do и while операторы), и если их нет, сценарий в целом завершается.

Однако вы можете просто изменить свой подход, чтобы использовать foreach l oop, где break работает, как и ожидалось:

# The last line to include in the output.
$stopLine = 'CHDN        = 84;        // CH   du Nord - Luxembourg                ,                          2019'

# Output all lines up to and including the stop line.
# Simply assign to a variable to capture all output lines:
#   $linesOfInterest = foreach ($line ...) { ... }
# Or wrap in $(...) to send to a file.
#   $(foreach ($line ...) { ... }) | Set-Content ...
foreach ($line in Get-Content file.txt) {
  $line 
  if($line -eq $stopLine) {break }
}

В качестве альтернативы используйте решение на основе регулярных выражений, которое захватывает все интересующие вас линии в виде одной многострочной строки (которую можно разбить на строки с помощью -split '\r?\n', если необходимо):

# The last line to include in the output.
$stopLine = 'CHDN        = 84;        // CH   du Nord - Luxembourg                ,                          2019'

# Use the -match operator with a regex that that captures everything
# from the beginning of the the file through the stop line, inclusively.
if ((Get-Content -Raw file.txt) -match '(?sm).*^{0}$' -f [regex]::Escape($stopLine)) {
  # Output what was captured.
  # Append -split '\r?\n' to split into an array of lines.
  $Matches[0]
}
  • (?sm) устанавливает параметры регулярных выражений s (также, чтобы . соответствовало символам перевода строки) и m (* ^ и $ соответствуют e nd и начало отдельных строк)

  • .* соответствует любой последовательности символов, в том числе ни одной

  • ^{0}$ соответствует экранированной линии останова (через [regex]::Escape(), чтобы обеспечить его полное совпадение буквально ), где {0} - это заполнитель для экранированной строки, замененной на -f, Оператор форматирования строки

  • Если -match, оператор сопоставления регулярного выражения завершается успешно, он заполняет automati c $Matches переменная , чья запись 0 содержит то, что полностью соответствует регулярному выражению.

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