Regex Powershell v2。删除或删除文本行。正则表达式发行

Regex Powershell v2。删除或删除文本行。正则表达式发行,regex,line,special-characters,powershell-2.0,Regex,Line,Special Characters,Powershell 2.0,今天我读了很多文章,这些文章提供了Powershell示例,说明如何使用行号从文件中删除整行内容。不幸的是,它们中没有一个完全符合我的需要,或者它们有一些'but'类型的子句 我发现的最接近的示例使用了-remove方法。这成功地完成了工作,直到我注意到并不是所有我试图删除的行都被删除。经过进一步的研究,我发现-remove依赖于Regex,并且Regex不喜欢某些特殊字符,这些字符恰好出现在我希望删除/删除的行中 我使用的例子不是我自己的作品。user2233949制作(干杯,伙计)我发现它非

今天我读了很多文章,这些文章提供了Powershell示例,说明如何使用行号从文件中删除整行内容。不幸的是,它们中没有一个完全符合我的需要,或者它们有一些'but'类型的子句

我发现的最接近的示例使用了-remove方法。这成功地完成了工作,直到我注意到并不是所有我试图删除的行都被删除。经过进一步的研究,我发现-remove依赖于Regex,并且Regex不喜欢某些特殊字符,这些字符恰好出现在我希望删除/删除的行中

我使用的例子不是我自己的作品。user2233949制作(干杯,伙计)我发现它非常简单,所以我将它制作成一个函数:

Function DeleteLineFromFile ($Path, $File, $LineNumber){
        $Contents = Get-Content $Path\$File
        $Contents -replace $Contents[$LineNumber -1],"" | Set-Content $Path\$File
        }
我认为这是一个很好的例子。只有正则表达式不能处理特殊字符


我们的目标是:创建一个不关心行中内容的函数。我不想给它提供路径、文件和行,然后让函数删除该行并保存文件。

这相当简单,根本不需要正则表达式

读取文件:

$lines = Get-Content $Path\$File
然后我们有一个数组,其中包含文件中的行。当我们有一个数组时,我们可以使用索引从数组中获取元素,例如

$line[4]

将是第五行。您还可以将数组传递到索引中以返回多行:

$lines[0,1,5]   # returns the first, second and 6th line
$lines[0..5]    # returns the first 6 lines
我们可以用一个小技巧来利用它。PowerShell的比较运算符(例如,
-eq
与左侧的数组的工作方式不同,因为它们不返回
$true
$false
,而是返回与比较匹配的数组中的所有元素:

1..5 -ge 3      # returns 3,4,5
0..8 -ne 7      # returns 0 through 8, *except* 7
你也许可以看到这是怎么回事

$filteredLines = $lines[0..($lines.Length-1) -ne $LineNumber - 1]
从技术上讲,您可以忽略
$lines.Length
之后的
-1
,因为在数组之外建立索引根本不起任何作用。不过,这实际上删除了要删除的行。如果您只是想用一个空行来替换它(您的代码似乎正在这样做,但听起来不像您想要的那样),那么这种方法将不起作用

不过,还有其他选项,例如使用
ForEach对象

Get-Content $Path\$File |
  ForEach-Object { $n = 1 } {
    if ($n -ne $LineNumber) { $_ } else { '' }
  }

关于编写函数的一点建议:通常您没有单独的
$Path
$File
参数。它们没有真正有用的用途。每个cmdlet仅使用一个
$Path
参数,该参数在需要时指向文件。如果您需要文件所在的文件夹,您可以始终使用
分割路径-Parent$Path
来获取它。

嗨,乔伊。谢谢你的帮助。当我使用您的ForEach对象示例并通过管道将结果输出到文件或设置内容时。。我有个错误告诉你嗨,乔伊。谢谢你的帮助。当我使用您的ForEach对象示例并将结果导出文件或设置内容时。。。我收到一个错误,建议不允许使用空管道元素。你能给我一个完整的例子,说明你将如何形成这个函数,并让它输出结果来设置内容吗?嗨,再次,没关系。我解决了设置内容的问题。但是用你的方法,我似乎还是无法删除这些行。。。