powershell - 删除特定文本后的空行(不使用 -notmatch)
问题描述
我们有一个脚本,它使用一个函数来遍历一个文本文件并将某些单词替换为其他单词或什么都不替换。被替换为空的点会留下一个空白行,在某些情况下(但不是全部)我们需要将其删除。我见过几个地方,人们提到使用诸如-notmatch
将所有内容复制到新文件之类的东西,除了你想要留下的东西,但是我们想要留下很多空白行。
例如:
StrangerThings:Netflix 节目
“要删除的
空白线” “要删除的空白线”
演员:一些演员
剧组:勤奋的人
“留下的空白线”
KeyGrip
“要删除的空白线”
加弗“
留下的空白线”地方'
所以它是这样的:
StrangerThings:Netflix 节目
演员:一些演员
工作人员:勤奋的人
KeyGrip
Gaffer
我们试过做 a -replace
,但这并没有摆脱空行。此外,我们必须在每行中关闭“:”左侧的文本。在大多数情况下,右边的数据是动态的,所以我们不能为此硬编码任何东西。
function FormatData {
#FUNCTION FORMATS DATA BASED ON SECTIONS
#This is where we're replacing some words in the different sections
#Some of these we replace leave the blank lines behind
$data[$section[0]..$section[1]] -replace $oldword,$newword
$output | Set-Content $outputFile
}
$oldword = "oldword"
$newword = "newword"
FormatData
$oldword = "oldword1"
$newword = "" #leaves a blank line
FormatData
$oldword = "Some phrase: "
$newword = "" #leaves a blank line
FormatData
我们只需要一个指向正确方向的指针,说明如何在特定文本之后删除/删除一个空行(或几行),拜托。
解决方案
由于看起来您正在读取数组并进行替换,因此数组索引不会消失。您可以将值更改为空白或空格,当它输出到文件或控制台时,它仍然会显示为空白行。使用-replace
不带替换字符串的运算符,将正则表达式匹配替换为空字符串。
一种方法是读取原始数据Get-Content -Raw
,然后将文本按原样读入内存,但您会丢失数组索引。此时,如果您选择这样做,您可以完全控制替换换行符。第二种方法是标记您最初想要保留的空白行(<#####>
在此示例中),进行替换,删除空格,然后清理标记。
# Do this before any new word replacements happen. Pass this object into any functions.
$data = $data -replace "^\s*$","<#####>"
$data[$section[0]..$section[1]] -replace $oldword,$newword
($output | Where-Object {$_}) -replace "<#####>" | Set-Content $outputFile
解释:
任何为空格、空白或 null的值都将false
在 PowerShell 布尔条件语句中计算为。由于Where-Object
脚本块执行布尔条件评估,因此您只需检查管道对象 ( $_
)。任何不是空格、null 或空的值(在本例中为一行)都将为true
.
以下是该行为的一个简单示例:
$arr = "one","two","three"
$arr
one
two
three
$arr -replace "two"
one
three
$arr[1] = "two"
$arr
one
two
three
$arr -replace "two" | Where-Object {$_}
one
three
您可以将特定的数组值设置为$null
并让它看起来消失。写入文件时,看起来好像该行已被删除。但是,该数组仍将具有该$null
值。所以你必须小心。
$arr[1] = $null
$arr
one
three
$arr.count
3
如果您使用其他支持调整大小的集合类型,则可以使用该Remove
方法。但是,此时您正在添加额外的逻辑来处理索引删除,并且在更改集合大小时无法枚举集合。
推荐阅读
- php - PHP Incrementing Array by 1
- javascript - 如何在画布元素中切割圆圈
- sql-server - 在参数化的 SELECT 中使用转义字符的问题
- reactjs - 如何使用 React 直接路由到子视图?
- c# - 无法将位图转换为 IplImage
- android - 使用 androidx.fragment.app.FragmentContainerView 时出现 ClassNotFoundException
- javascript - 在由 onFinalize 触发的 Firebase 云函数中获取已创建文件的兄弟姐妹
- c - 为什么 sum1 = 46 和 sum2 = 48
- sql-server - 范围的存储过程参数
- android - 导致崩溃的奇怪启动行为