Учитывая текстовый файл, я хочу заменить весь текст (в нескольких строках) между двумя заданными словами.
Пример текстового файла:
line1 line2 XstartX line4 XendX line5
если бы я хотел заменить весь текст между start
и end
на YYY
получившийся файл должен быть
line1 line2 XstartYYYendX line5
Я пытался
$file='C:\Path\to\file.txt'
$raw = Get-Content $file -Raw
$raw -ireplace '(?<=start).+?(?=end)', 'YYY'
$raw | Set-Content $file
но ... не повезло!
оно работает! Мне не хватало (?sm)
, не могли бы вы объяснить и ответить, чтобы я мог выбрать его как правильный ответ?
Я также заметил кое-что, чего мне не хватало ... строка 4 сценария должна быть $raw = $raw -ireplace '(?sm)(?<=start).+?(?=end)', 'YYY'
(?s)
должно хватить. .
обычно не соответствует символам перевода строки, поэтому ваше выражение не будет соответствовать тексту в нескольких строках без модификатора (?s)
. В качестве альтернативы вы можете использовать [\s\S]+?
вместо .+?
для соответствия любому символу (включая перевод строки).
это правда, (?s)
хватит! .
отлично работает даже с несколькими строками
Как упоминалось в комментариях, вам необходимо включить модификатор s
, чтобы .+?
part также соответствовал разрывам строк.
Как упоминает Ансгар, m
здесь не обязателен, но может улучшить start
, закрепив в начале строки с (?<=^xstart)
.
$file='C:\Path\to\file.txt'
$raw = Get-Content $file -Raw
$raw = $raw -ireplace '(?s)(?<=start).+?(?=end)', 'YYY'
$raw | Set-Content $file
Или
$file='C:\Path\to\file.txt'
$raw = (Get-Content $file -Raw) -ireplace '(?s)(?<=start).+?(?=end)', 'YYY'
$raw | Set-Content $file
Попробуйте
$raw -ireplace '(?sm)(?<=start).+?(?=end)', 'YYY'
. Вам также нужно будет установить измененное значение для переменной в тот момент, когда вы просто выводите на экран.