AlexZeDim
@AlexZeDim

Powershell -replace -regexp -raw сложная замена с табуляцией?

Есть test.lua файл (UTF-8) с содержанием:
function private.PostAuctionsThread(self, auctionInfo)
	self:SetThreadName("SHOPPING_POST_AUCTIONS")
	local auctionRecord = auctionInfo.record
	local postFrame = private.frame.content.result.confirmation.post
	private.frame.content.result.cancelBtn:Disable()
	private.frame.content.result.postBtn:Disable()
	private.frame.content.result.bidBtn:Disable()
	private.frame.content.result.buyoutBtn:Disable()
	postFrame.postBtn:Enable()
	postFrame.closeBtn:Enable()

	local undercut = (TSMAPI:GetCustomPriceValue(TSM.db.global.postUndercut, auctionRecord.itemString) or 1)
	if undercut > auctionRecord.itemBuyout then
		undercut = 1
	end
	if TSMAPI.Player:IsPlayer(auctionRecord.seller, true, true, true) then
		-- don't undercut ourselves
		undercut = 0
	end
	local auctionBuyout
	if auctionRecord.isFake then
		auctionBuyout = TSMAPI:GetCustomPriceValue(TSM.db.global.normalPostPrice, auctionRecord.itemString) or 1000000
	else
		auctionBuyout = auctionRecord.buyout - (undercut * auctionRecord.stackSize)
	end

в котором необходимо заменить фрагмент:
<табуляция>	if TSMAPI.Player:IsPlayer(auctionRecord.seller, true, true, true) then
<табуляция><табуляция>		-- don't undercut ourselves
<табуляция><табуляция>		undercut = 0
<табуляция>	end

с помощью скрипта через Powershell. Казалось бы ничего проще, верно? Ну уж нет. И так, есть сам скрипт:
$text ="фрагмент"
$content = [System.IO.File]::ReadAllText(путьдо\test.lua")
(Get-Content 'путьдо\test.lua')  -replace $test,"example" | Set-Content 'путьдо\test.lua'

который вполне успешно работает и всё меняет, но только в пределах одной строки. Вопрос состоит в том, как заставить его работать в пределах нескольких строк? И вообще, возможно ли это?

Да, есть специальные символы вроде: `r - возврат каретки `n - переход на следующую строку `t - табуляция `s - пробел, и можно написать что-то вроде:
if TSMAPI.Player:IsPlayer(auctionRecord.seller, true, true, true) then`n`t-- don't undercut ourselves...

и даже пройти проверку на содержание, через $text.contains (четыре`n`tстроки`n`tв`n`tодну) и ответом будет true
Можно просто вывести $content прямо в Powershell, найти нужный фрагмент и через Ctrl+C, Ctrl+V внести необходимый фрагмент в переменную $text

Но на практике, всё это почему не работает.
Возможно, есть какой-то хак с преобразованием строк или через кодировку всего файла в string и (hex) с удалением необходимых элементов и преобразованием назад с сохранением форматирования...
Или можно задать маску в виде паттерна, где началом будет служить первая строка, а последней - первый попавшийся "end"...

Я понимаю что хожу вокруг да около, но упорно не могу понять в чем тут дело. Есть у кого какие-либо идеи?
  • Вопрос задан
  • 983 просмотра
Решения вопроса 1
@azarij
В меру опытный никто
а если вставить в начало описания фрагмента для замены (?s)?
$a = $b -replace "(?s)blablabla
bla bla bla
bla bla bla"
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы