首页 > 解决方案 > 如何使用powershell脚本替换文本文件中的值

问题描述

我的文件包含以下数据(无标题)

DEPOSIT ADD     123456789 (VALUE)(VARIABLE) NNNN    VALUEVARIABLE                                                   
DEPOSIT ADD     234567890 (VALUE)(P75)  NNNN    VALUEVARIABLE                                               
DEPOSIT ADD     345678901 (VALUE)(VARIABLE) NNNN    VALUEVARIABLE           

这是一个制表符分隔的文本文件。共有5列。(123456789 (VALUE)(VARIABLE) 是单值列)

我的要求是:

  1. 我只需要获取包含P75的行以在同一文件中更新。
  2. 在获取P75后,我必须替换 Col3、Col4 和 Col5 中的值,其他行应该不受影响。

DEPOSIT ADD     234567890 (VALUE)(P75)  NNNN    VALUEVARIABLE

DEPOSIT ADD     234567890 (VTG)(SPVTG)  TCM    VTGSPVTG
  1. 只有包含 P75 的记录才应该这样更新。所有选定记录的替换值相同。

我写的脚本是

$original_file='C:\Path\20200721130155_copy.txt' -header Col1,Col2,Col3,Col4,Col5,| Select Col3,Col4,Col5

(Get-Content $original_file) |ForEach-Object {

    if($_.Col3 -match '(VALUE)(P75)')
    {
    $_ -replace '(VALUE)(P75)', '(VTG)(SPVTG)' `
       -replace 'VALUEVARIABLE', 'VTGSPVTG' `
       -replace 'NNNN', 'TCM' `
    } 
    $_
    }| Set-Content $original_file+'_new.txt' -Force
 

我得到具有相同内容的输出文件。该文件没有得到更新。

请指教。

谢谢

标签: powershell

解决方案


您可以执行以下操作:

$newfile = "{0}_new.txt" -f $original_file
Get-Content $original_file | Foreach-Object {
    if ($_ -match '\(VALUE\)\(P75\)') {
        $_ -replace '\(VALUE\)\(P75\)','(VTG)(SPVTG)' -replace 'VALUEVARIABLE', 'VTGSPVTG' -replace 'NNNN', 'TCM'
    } else {
        $_
    }
} | Set-Content $newfile -Force

由于-replace使用正则表达式,因此您必须使用反斜杠转义特殊的正则表达式字符,例如(and )

由于$_是从Get-Contentwithout读取的当前行,因此如果您不想进行任何更改-Raw,则需要输出。$_如果您确实要替换文本,$_ -replace 'regex','text'则将输出带有替换文本的该行。


或者,您可以在语句中应用上述相同的逻辑switch,这样效率更高:

$newfile = "{0}_new.txt" -f $original_file
$(switch -regex -file $original_file {
    '\(VALUE\)\(P75\)' {
        $_ -replace '\(VALUE\)\(P75\)','(VTG)(SPVTG)' -replace 'VALUEVARIABLE', 'VTGSPVTG' -replace 'NNNN', 'TCM'
    }
    default { $_ }
}) | Set-Content $newfile -Force

推荐阅读