Powershell:多次替换和删除

时间:2015-01-16 15:34:06

标签: powershell replace foreach

我需要这个脚本的帮助。我已经慢慢走了这一步,但此时需要帮助。

我需要一个脚本,将文本从一个部分的末尾移动到文件中的某个点,然后删除移动的文本。要移动的文本具有标记,位置也是如此。我需要能够在移动后删除文本。还需要在同一目录中的多个txt文件上完成。

例如:

Sample Input .txt

A;1;1;####; (#### is the location (1) marker)
B
B
B
====-1234 (==== is the find (1) marker)
A;1;1;####; (#### is the location (2) marker)
B
B
B
====-5678 (==== is the find (2) marker)

After processing

A;1;1;1234;
B
B
B
A;1;1;5678;
B
B
B

文本文件可以有多个这样的分组。需要从上到下为每个分组执行此操作。这是我到目前为止,它只是移动文本而不删除。

$file = "C:\Users\NX07934\Documents\Projects\23045\Docs\SampleData\*.txt"
$old = "\####" 

$find = Get-ChildItem $file -recurse| Select-String -pattern "====-*"

$split = $find.ToString().Split("-")
$new = $split[1]


get-childitem "C:\Dir" -recurse -include *.txt | 
select -expand fullname |
    foreach 
    { 
        (Get-Content $_) -replace $old,$new |
        Set-Content $_            
    }

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

任何帮助?

$text = 
@'
A;1;1;####;
B
B
B
====-1234
A;1;1;####;
B
B
B
====-5678
'@

$regex = 
@'
(?ms)(.+?####;
.+?)
====-(\d+)
'@

([regex]::matches($text,$regex) |
foreach {
$_.groups[1].value -replace '####',($_.groups[2].value)
}) -join ''

A;1;1;1234;
B
B
B
A;1;1;5678;
B
B
B

编辑: - 将其应用于文件集合:

$regex = 
@'
(?ms)(.+?####;
.+?)
====-(\d+)
'@

Get-Childitem -Path C:\somedir -Filter *.txt |
foreach {

    $Text = Get-Content $_ -Raw

    ([regex]::matches($text,$regex) |
    foreach {
    $_.groups[1].value -replace '####',($_.groups[2].value)
    }) -join '' |
    Set-Content $_.FullName
 }