Powershell - 在多重字符串中替换“文本模式”

时间:2017-02-18 14:29:31

标签: regex powershell replace

我有一个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

我想删除/替换此模式

<tab here>if TSMAPI.Player:IsPlayer(auctionRecord.seller, true, true, true) then
    <tab><tab>-- don't undercut ourselves
    <tab><tab>undercut = 0
<tab here>end

通过Powershell脚本:

$text ="pattern_here!"
$content = [System.IO.File]::ReadAllText(path_to\test.lua")
(Get-Content 'path_to\test.lua')  -replace $test,"example" | Set-Content 'path_to\test.lua'

因此脚本可以完美地替换/删除操作,但只能在一个字符串中。

我已经尝试过: 将$ text.contains与

一起使用
`r `n `t `s — Escape characters

即使PowerShell回复为“true”也不会改变任何内容

this script from StackOverflow但是它会更改每个字符串的“end”,而不仅仅是“undercut = 0”旁边的字符串

那么,我加入了什么错误?已经浪费3 H +了。是否可以使用掩码,其中第一个字符串应该是$ pattern的开头,第一个“结束”将是结束字符串?

或者我应该将所有这些字符串转换为数组? 或者......使用concat?有什么想法吗?

2 个答案:

答案 0 :(得分:1)

一个选项:

$text = 
@'
   if TSMAPI.Player:IsPlayer(auctionRecord.seller, true, true, true) then
            -- don't undercut ourselves
            undercut = 0
    end
Keep this text
   if TSMAPI.Player:IsPlayer(auctionRecord.seller, true, true, true) then
            -- don't undercut ourselves
            undercut = 0
    end

'@

$replace_text = 
@'
   if TSMAPI.Player:IsPlayer(auctionRecord.seller, true, true, true) then
            -- don't undercut ourselves
            undercut = 0
    end
'@

$regex = "(?ms)$([regex]::Escape($replace_text))"

$text -replace $regex,"example"

正则表达式使用[regex]::Escape()构建,使用简单复制并粘贴数据样本的文本。 (?ms)选项使其可用于多行数据

答案 1 :(得分:0)

好吧,这有点不寻常,但我浪费了近4个半小时。 对于所有阅读此内容的人,使用(Get-Content&#39; path_to \ test.file&#39; -raw 如果您正在处理不同的内容通常的.txt文件,无所谓&#34; filetype&#34;或&#34; charset&#34;。