用于写入文件的Powershell脚本,以保持结构

iovurdzv  于 2022-12-29  发布在  Shell
关注(0)|答案(1)|浏览(157)

我正在使用powershell读取一个文件。请参阅文件中的示例内容。

This is my file with content
-- #Start
This is more content
across different lines
etc etc
-- #End

我正在使用这段代码将文件读入一个变量。

$content = Get-Content "Myfile.txt";

然后,我使用这段代码从文件中剥离一个特定的部分,并基于开始和结束标记。

$stringBuilder = New-Object System.Text.StringBuilder;
$pattern = "-- #Start(.*?)-- #End";
$matched = [regex]::match($content, $pattern).Groups[1].Value; 
$stringBuilder.AppendLine($matched.Trim());
$stringBuilder.ToString() | Out-File "Newfile.txt" -Encoding utf8;

我的问题是在我写入的文件中,格式没有被维护。所以我想要的是:

This is more content
across different lines
etc etc

但我得到的是:

This is more content across different lines etc etc

有什么想法我可以改变我的代码,以便在输出文件的结构是保持(多行)?

b4lqfgs4

b4lqfgs41#

这个正则表达式可以满足你的要求,在这种情况下使用StringBuilder没有意义。注意,因为这是一个多行正则表达式模式,你需要使用-Raw开关来读取文件的内容。

$re = [regex] '(?ms)(?<=^-- #Start\s*\r?\n).+?(?=^-- #End)'
$re.Match((Get-Content path\to\Myfile.txt -Raw)).Value |
    Set-Content path\to\newFile.txt -NoNewLine

有关详细信息,请参见https://regex101.com/r/82HJxf/1
如果你想进行“逐行”处理,你可以使用switch来读取和处理感兴趣的行,这在文件很大,内存放不下的时候特别有用。

& {
    $capture = $false
    switch -Rege -File path\to\Myfile.txt {
        '^-- #Start' { $capture = $true }
        '^-- #End' { $capture = $false }
        Default { if($capture) { $_ } }
    }
} | Set-Content path\to\newFile.txt

如果开始标记和结束标记只出现一次,您甚至可以在遇到结束标记时立即break开关以停止处理:

'^-- #End' { break }

相关问题