首页 > 解决方案 > 在powershell脚本中替换字符串中的子字符串

问题描述

我有很长的文本文件,其中包含另一个软件的标记。文本的形式是这样的:

*INIT=D:\ws\**randomnonesense*
 ROW=THISISROW,D:\ws\morestuff
 PALVELU=200,WSTIME70.DLL,N,A
 PALVELU=201,WSLDIR70.DLL,N,A
 PALVELU=202,WSLDIX70.DLL,N,A
 PALVELU=204,WSEXCE32.DLL,N,A
 PALVELU=205,WMON.DLL,N,A
 PALVELU=206,WSWORD32.DLL,N,A
 PALVELU=207,WSLEPT32.DLL,N,A
 PALVELU=208,WSCONV70.DLL,N,A
 PALVELU=209,WSFTPC70.DLL,N,A
 KUVAUS=\\192.168.169.17\adwise$\applic\LIKSA_TURE.A70,D:\ws\%aspno%\%username%
 MDBS-KANTA=LIKSAV,%aspno%LIK.DB,5,RTTL,ANSI,111.111.111.11MDBS- 
 KANTA=LANKA,%aspno%LAN.DB,5,RTTL,ANSI,1000.000.111.11

我正在编写一个脚本,它需要替换所有以 PALVELU 开头的行。这些行之前和之后的其他东西的数量可以是任意的。在每个文件中,这些 PALVELU 行的数量或它们的长度也不相同。我仍然需要用另一组行替换每个文件中的所有这些行。有没有办法做到这一点?

标签: stringpowershell

解决方案


如果目标是用新行替换每一PALVELU行,您可以执行以下操作:

# Assumes your file is a.txt
$ReplaceThis = '^PALVELU.*$'
$ReplaceWith = '<new row>'
$(switch -regex -file a.txt {
    $ReplaceThis { $_ -replace $ReplaceThis,$ReplaceWith }
    Default { $_ }
}) | Set-Content a.txt

上面的代码将导致 X number of PALVELUrows 被 X number of 替换<new row>


如果目标是在仅包含一组连续行的文件PALVELU中用单个字符串替换连续行,您可以执行以下操作:<new row>PALVELU

$ReplaceThis = '(?sm)^PALVELU.*(?-s)^PALVELU.*$'
$ReplaceWith = '<new row>'
(Get-Content a.txt -Raw) -replace $ReplaceThis,$ReplaceWith |
    Set-Content a.txt

如果目标是在第一行的位置PALVELU用单个<new row>字符串替换所有行,PALVELU并且这些行可以位于文件中的任何位置,您可以执行以下操作:

$ReplaceThis = '^PALVELU.*$'
$ReplaceWith = '<new row>'
$firstMatch = $false
$(switch -regex -file a.txt {
    $ReplaceThis {
        if ($firstMatch) { 
            $_ -replace $ReplaceThis
        }
        else {
            $_ -replace $ReplaceThis,$ReplaceWith
            $firstMatch = $true
        }
    }
    default { $_ }
}) -ne '' | Set-Content a.txt

推荐阅读