仅在每行的某些列位置中查找和替换字符

时间:2013-07-08 23:31:03

标签: powershell

我正在尝试编写一个脚本来查找前11个字符中的所有句点或每行的最后147个字符(行的固定宽度为193,所以我试图忽略字符12到45)。 / p>

首先,我想要一个脚本,它只能找到每行的第一个或最后一个部分的所有句点,但是如果我找到它们,我想用0替换所有句点,但忽略第12到第45行的句点并留下那些。它将扫描目录中的所有* .dat文件,并在子文件夹中创建无期间副本。到目前为止,我有:

$data = get-content "*.dat"
foreach($line in $data)
{
   $line.substring(0,12)
   $line.substring(46,147)
}

然后我用>运行它然后Output.txt执行select-string Output.txt -pattern“。”。正如你所看到的,我离目标很远,目前我的程序正在将所有文件混合在一起,而且我还没有想出如何进行任何替换。

2 个答案:

答案 0 :(得分:3)

Get-Item *.dat |
    ForEach-Object {
        $file = $_
        $_ | 
            Get-Content | 
            ForEach-Object {
                $beginning = $_.Substring(0,12) -replace '\.','0'
                $middle = $_.Substring(12,44)
                $end = $_.Substring(45,147) -replace '\.','0'
                '{0}{1}{2}' -f $beginning,$middle,$end
            } |
            Set-Content -Path (Join-Path $OutputDir $file.Name)
    }

答案 1 :(得分:2)

您可以使用powershell -replace运算符替换“。”用“0”。然后使用子字符串来构建您感兴趣的字符串的三个部分以获取更新的字符串。这将为输入的每一行输出更新的行。

$data = get-content "*.dat"
foreach($line in $data)
{
    ($line.SubString(0,12) -replace "\.","0") + $line.SubString(13,34) + ($line.substring(46,147) -replace "\.","0")
}

请注意-replace运算符执行正则表达式匹配和“。”是一个特殊的正则表达式字符,因此您需要使用“\”转义它。