首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Powershell -读取、更改行、在文本文档中将新行覆盖旧行

Powershell -读取、更改行、在文本文档中将新行覆盖旧行
EN

Stack Overflow用户
提问于 2020-09-29 08:53:02
回答 2查看 38关注 0票数 0

我正在逐行阅读一个文本文件。如果我看到一个特定的字符串,我会定位一个特定字符的第一个和最后一个字符,使用两个子字符串来创建一个较小的字符串,然后替换文本文件中的行。

困难的部分是:我将文本行存储在一个变量中,但不知道如何在文本文档中的旧行上写出这一新行。

请原谅我粗糙的代码--我一直在测试一些东西,几个小时前才开始使用PowerShell。

代码语言:javascript
运行
复制
foreach($line in [System.IO.File]::ReadLines("C:\BatchPractice\test.txt"))
{
       Write-Output $line
       if ($line.Contains("dsa")) {
           Write-Output "TRUEEEEE"
           
       }
       $positionF = $line.IndexOf("\")+1
       $positionL = $line.LastIndexOf("\")+1
       $lengthT = $line.Length
       Write-Output ($positionF)
       Write-Output $positionL
       Write-Output $lengthT
       if($line.Contains("\")){
           Write-Output "Start"
            $combine = $line.Substring(0,$positionF-1) + $line.Substring($postionL,($lengthT-$positionL))
            Write-Output $combine
            $line1 = $line.Substring(0,$positionF-1)
            $line2 = $line.Substring($positionL,($lengthT-$positionL))
            $combined = $line1 + $line2
            Write-Output $combined
            Write-Output "Close"
       }
}```
EN

回答 2

Stack Overflow用户

发布于 2020-09-29 09:28:07

您可以在Get-ContentSet-Content中将文件另存为数组

代码语言:javascript
运行
复制
$file=(Get-Content "C:\BatchPractice\test.txt")

然后你可以像数组一样编辑它:

代码语言:javascript
运行
复制
$file[LINE_NUMBER]="New line"

其中LINE_NUMBER是从0开始的行号。

然后覆盖到文件:

代码语言:javascript
运行
复制
$file|Set-Content "C:\BatchPractice\test.txt"

您可以在代码中实现此功能。创建一个变量$i=0,并在循环结束时递增它。这里,$i将是每次迭代的行号。

HTH

票数 0
EN

Stack Overflow用户

发布于 2020-09-29 11:01:34

根据您的代码,您似乎想要获取任何包含'dsa‘的行,并删除第一个反斜杠之后的内容,直到最后一个反斜杠。如果是这样的话,我建议使用regex简化您的代码。首先,我制作了一个示例文件,因为没有提供任何文件。

代码语言:javascript
运行
复制
$tempfile = New-TemporaryFile

@'
abc\def\ghi\jkl
abc\dsa\ghi\jkl
zyx\vut\dsa\srq
zyx\vut\srq\pon
'@ | Set-Content $tempfile -Encoding UTF8

现在我们将读取所有行(除非这是一个大文件)

代码语言:javascript
运行
复制
$text = Get-Content $tempfile -Encoding UTF8

接下来,我们将创建一个包含要替换的模式的regex对象。双反斜杠是为了对反斜杠进行转义,因为它对正则表达式有意义。

代码语言:javascript
运行
复制
$regex = [regex]'(?<=.+\\).+\\'

现在我们将遍历每一行,如果它有dsa,我们将对它运行替换,否则我们将输出该行。

代码语言:javascript
运行
复制
$text | ForEach-Object {
    if($_.contains('dsa'))
    {
        $regex.Replace($_,'')
    }
    else
    {
        $_
    }
} -OutVariable newtext

您将在屏幕上看到输出,但它也是在$newtext变量中捕获的。我建议在写之前确保它是你想要的输出。

代码语言:javascript
运行
复制
abc\def\ghi\jkl
abc\jkl
zyx\srq
zyx\vut\srq\pon

确认后,只需将其写回文件即可。

代码语言:javascript
运行
复制
$newtext | Set-Content $tempfile -Encoding UTF8

显然,您也可以将这些步骤组合在一起。

代码语言:javascript
运行
复制
$text | ForEach-Object {
    if($_.contains('dsa'))
    {
        $regex.Replace($_,'')
    }
    else
    {
        $_
    }
} | Set-Content $tempfile -Encoding UTF8
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64111431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档