Самый простой и более быстрый подход заключается в чтении входного файла в виде однострочной, многострочной строки с Get-Content -Raw
и разрешении регулярному выражению, переданному в -replace
, работать через несколько строк:
(Get-Content -Raw result2.adoc) -replace '(?s)^.+?\n(?==)' |
Set-Content result3.adoc
(?s)
активирует встроенную опцию s
, которая позволяет .
соответствовать символам новой строки (\n
).
^.+?\n(?==)
соответствует от начала строки (^
) любому количеству символов (включая символы новой строки) (.+
), без жадности (?
)
донайден символ новой строки (\n
), за которым следует =
.
(?=...)
- это прогнозное утверждение, которое соответствует =
без потребления it, т.е., не считая ее частью подстроки, которая соответствует.
Поскольку операнд-заменитель не передается в -replace
, все совпадение заменяется подразумеваемой пустой строкой , то есть то, что было сопоставлено, фактически удалено .
Что касается того, что вы пытались :
Оператор -replace
передает свой LHS через , если совпадений не найдено, поэтому вы не можете использовать его для отфильтровывания несоответствующих строк.
Даже если вы соответствуетенежелательную строку полностью и замените ее на ''
(пустая строка), она будет отображаться как пустая строка в выводе при отправке на Set-Content
или Out-File
(>
).
Что касается вашего конкретного регулярного выражения, ^[^=]*.[+][\n]
(независимо от того, следует ли за первым ^
символ ESC (0x1b
).):
[\n]
(достаточно \n
) пытается найти символ новой строки.после литерала +
([+]
), но строки, считываемые индивидуально с Get-Content
(без -Raw
) по определению, равняются лишенным их завершающей строки, поэтому \n
никогда не будет совпадать;вместо этого используйте $
, чтобы соответствовать концу строки.
Вместо %
(встроенный псевдоним для командлета ForEach-Object
), который вы могли бы использовать ?
(встроенный псевдоним для командлета Where-Object
) для выполнения требуемой фильтрации:
Get-Content result2.adoc | ? { $_ -notmatch '^\e\[' }
$_ -notmatch '^\e['
возвращает $True
только для строк, которые не начинаются (^
) ссимвол ESC (\e
, кодовая точка которого 0x1b
), за которым следует литерал (\
) [
, тем самым эффективно отфильтровывая строки перед строкой = Heading
.
Однако,многострочная команда -replace
вверху является более прямым и быстрым выражением вашего намерения.