у меня есть файл
fill
---example---
fill
fill
---copy---
fill
и я хочу получить текст между -
и написать его ниже вот так
fill
---example---
example
fill
fill
---copy---
copy
fill
Да, я все еще хочу получить свои оригинальные струны.
Я пробовал много вещей, но самое близкое, что у меня получилось, это:
$regex = '---(?<text>.*)---'
(Get-Content -Path .\fichier.txt) -replace $regex, "---$($matches['text'])---`n$($matches['text'])" | Set-Content -Path .\fichier.txt
но файл становится таким
fill
---example---
example
fill
fill
---example---
example
fill
Как я могу пройти через все совпадения регулярных выражений?
Поведение Get-Content по умолчанию: читает по одной строке и возвращает коллекцию объектов, каждый из которых представляет строку контента.
Это означает, что вы можете просто транслировать следующим образом:
$regex = '---(?<text>.*)---'
Get-Content .\fichier.txt | ForEach-Object {
$_
if ($_ -Match $regex) { $matches['text'] }
}
Обратите внимание, что вы не можете передавать выходные данные непосредственно в тот же файл, из которого выполняется потоковая передача.
Для этого вы можете просто записать его в другой файл или заглушить конвейер, используя круглые скобки или присвоив содержимое переменной (которая загрузит все в память):
$Content = Get-Content .\fichier.txt | ForEach-Object { ...
И тогда:
$Content | Set-Content -Path .\fichier.txt
Мне удалось заставить это работать. Спасибо за вашу помощь
Да, я делал что-то подобное раньше, но не могу писать в указанный файл. Может быть, я что-то упускаю?