代码之家  ›  专栏  ›  技术社区  ›  leiseg

阻止PowerShell Replace在替换字符串中添加新行[重复]

  •  0
  • leiseg  · 技术社区  · 11 月前

    我有一个文本文件,有23718行文本 带BOM的UTF-16LE(Unicode) 编码。我在批处理文件中使用PowerShell CLI来查找和替换某些文本。

    这是我使用的代码:

    powershell -NoProfile -Command ^
        "Write-Host modifying InventoryItemTypes.GER...;" ^
        "$file = '%target%\InventoryItemTypes.GER';" ^
        "$content = (Get-Content -Raw -Encoding UTF8 $file);" ^
        "$content -Replace '(?m)(Weapon_AssaultRifle_.*_DisplayName)=\b(?!<color:.*>.*<\/color>\b)(.+)$', '$1=<color:R=1 G=1 B=0>$2</color>' |" ^
        "Set-Content -Encoding Unicode -NoNewLine $file"
    

    我的问题是,该命令替换了字符串,但将 </color> 每次更换都要更换一条新线。每个替换行的结果如下:

    InventoryItemTypes_Weapon_AssaultRifle_ATAC_DisplayName=<color:R=1 G=1 B=0>ATAC 424
    </color>
    

    我不知道为什么会发生这种情况。使用我在regex101上的正则表达式定义,它应该替换文本,而不放置 </颜色> 在一条新的线上。

    这是我想替换的文本片段:

    ...
    InventoryItemTypes_Weapon_AssaultRifle_STAR_Slot3_Valentines_Leased_CreatorName=Amorous Marketplace
    InventoryItemTypes_Weapon_AssaultRifle_STAR_Slot3_Valentines_Leased_DisplayName=<color:R=1 G=0.45 B=1>STAR 556 'Love-Gun'</color>
    InventoryItemTypes_Weapon_AssaultRifle_Star-LCR_PR1_Joker_CreatorName=Joker Distribution
    InventoryItemTypes_Weapon_AssaultRifle_Star-LCR_PR1_Joker_DisplayName=STAR 556 'LCR' PR1
    InventoryItemTypes_Weapon_AssaultRifle_VAS-R2-Base_CreatorName=Agrotech
    InventoryItemTypes_Weapon_AssaultRifle_VAS-R2-Base_DisplayName=VAS-R2_Base
    InventoryItemTypes_Weapon_AssaultRifle_VAS-R2-Base_Joker_CreatorName=Agrotech
    InventoryItemTypes_Weapon_AssaultRifle_VAS-R2-Base_Joker_DisplayName=VAS-R2 'Sword'
    InventoryItemTypes_Weapon_AssaultRifle_VAS-R2-Base_Slot3_Armas_CreatorName=Agrotech
    InventoryItemTypes_Weapon_AssaultRifle_VAS-R2-Base_Slot3_Armas_DisplayName=VAS-R2 'Sword' NFCP 3
    InventoryItemTypes_Weapon_AssaultRifle_VAS-R2-Base_Slot3_Joker_CreatorName=Agrotech
    InventoryItemTypes_Weapon_AssaultRifle_VAS-R2-Base_Slot3_Joker_DisplayName=VAS-R2 'Sword' JT3
    InventoryItemTypes_Weapon_AssaultRifle_VAS-R2-Sights_CreatorName=Agrotech
    InventoryItemTypes_Weapon_AssaultRifle_VAS-R2-Sights_DisplayName=VAS-R2_Sights
    InventoryItemTypes_Weapon_AssaultRifle_VAS-R2-Sights_Slot3_Armas_CreatorName=Agrotech
    InventoryItemTypes_Weapon_AssaultRifle_VAS-R2-Sights_Slot3_Armas_DisplayName=VAS-R2 'Scepter' NFCP 3
    InventoryItemTypes_Weapon_AssaultRifle_VAS-R2-Silenced_CreatorName=Agrotech
    InventoryItemTypes_Weapon_AssaultRifle_VAS-R2-Silenced_DisplayName=VAS-R2_Silenced
    InventoryItemTypes_Weapon_AssaultRifle_VAS-R2-Silenced_Slot3_Armas_CreatorName=Agrotech
    InventoryItemTypes_Weapon_AssaultRifle_VAS-R2-Silenced_Slot3_Armas_DisplayName=VAS-R2 'Crown' NFCP 3
    InventoryItemTypes_Weapon_AssaultRifle_Vespa_CreatorName=
    InventoryItemTypes_Weapon_AssaultRifle_Vespa_DisplayName=Vespa
    InventoryItemTypes_Weapon_AssaultRifle_VespaStock_CreatorName=
    InventoryItemTypes_Weapon_AssaultRifle_VespaStock_DisplayName=Vespa Stock
    InventoryItemTypes_Weapon_AssaultRifle_VespaTactical_CreatorName=
    InventoryItemTypes_Weapon_AssaultRifle_VespaTactical_DisplayName=Vespa Tactical
    InventoryItemTypes_Weapon_MattTest_CreatorName=
    InventoryItemTypes_Weapon_MattTest_DisplayName=
    ...
    

    我想添加 <color:R=1 G=1 B=0> </颜色> 包含的所有行 Weapon_AssaultRifle_.*_Displayname= 并且还没有像代码片段的第二行那样指定颜色代码。

    例子:

    更改

    InventoryItemTypes_Weapon_AssaultRifle_Star-LCR_PR1_Joker_DisplayName=STAR 556 'LCR' PR1
    

    InventoryItemTypes_Weapon_AssaultRifle_Star-LCR_PR1_Joker_DisplayName=<color:R=1 B=1 B=0>STAR 556 'LCR' PR1</color>
    

    并保持

    InventoryItemTypes_Weapon_AssaultRifle_STAR_Slot3_Valentines_Leased_DisplayName=<color:R=1 G=0.45 B=1>STAR 556 'Love-Gun'</color>
    

    InventoryItemTypes_Weapon_MattTest_DisplayName=
    

    事实上。

    1 回复  |  直到 11 月前
        1
  •  1
  •   123    11 月前

    多行标志的使用 (?m) 具有 (.+)$ 是一个问题:

    • 你可以改变 (.+)$ ([^\r\n]+)$ .

    • 或者,似乎这些正则表达式:

    (Weapon_AssaultRifle_[^\r\n]*_DisplayName)=(\w[^\r\n]*)$
    (Weapon_AssaultRifle_[^\r\n]*_DisplayName)=([^<\r\n]*)$
    (Weapon_AssaultRifle_[^\r\n]*_DisplayName)=([^<][^\r\n]*)$
    

    替换为:

    $1=<color:R=1 G=1 B=0>$2</color>
    

    可能真的有效。