1 其实powersehll提取文本指定的列和指定字符,只需要熟悉一行怎么提取,文本直接使用foreach循环遍历一行一行提取即可。
#如果是处理一个文本,里面有多行,用foreach循环遍历处理
$file = Get-Content .\1.txt
#遍历文本中每一行内容,每一行相当于循环代码一次,如果有10行,代码将会执行10次,其中$i是遍历到当行的值。
foreach ($i in $file) {
$result = ($i -split "\s+")[0] + " " + ($i -split "\s+")[3] #中间加条件即可,这是是打印第一列和第三列,合在一行,以空格为分隔符。
Write-Host $result
}
在 PowerShell 中,处理文本字符时,常用的截取命令有以下几个:
#1 Select-String:用于从文本中选择匹配的字符串。
$text = "Hello, World!"
$pattern = "Hello" #支持正则匹配 $pattern = "\d+" 匹配一个或者多个数字
$match = $text | Select-String -Pattern $pattern #这里值提取匹配遇到的第一个Hello
$matches = $text | Select-String -Pattern $pattern -AllMatches #加上-AllMatches获取匹配的所有的Hello
$result = $match.Matches.Value #$match.Matches 输出其实一个是一个对象了,使用Value获取提取的Hello属性值
$match.Matches #输出结果
Groups : {0}
Success : True
Name : 0
Captures : {0}
Index : 0
Length : 5
Value : Hello
Write-Output $result # 输出:"Hello"
# 2 -split 操作符:使用指定的分隔符将字符串拆分为子字符串。
$text = "Hello, World!"
$substrings = $text -split ", " #支持正则匹配,默认对大小写不敏感,使用 -csplit 可严格匹配到大小写
Write-Output $substrings[0] # 输出:"Hello"
Write-Output $substrings[1] # 输出:"World!"
#3 字符串索引和子字符串截取:
$text = "Hello, World! are you ok"
$substring1 = $text[0] # 提取第一个字符,输出:"H"
$substring1
$substring2 = $text.Substring(7) # 从索引位置 7 开始提取后面所有字符,输出:"World! are you ok"
$substring2
2 使用 PowerShell 对文本进行增删改操作时,有一些需要注意的事项。以下是一些常见的注意事项:
- 文件编码:确保在读取或写入文件时指定正确的文件编码。默认情况下,PowerShell 使用 Unicode 编码 (
UTF-16 LE
) 进行文件操作,但如果文件是其他编码(如UTF-8
或ASCII
),则需要指定正确的编码。
# 以 UTF-8 编码读取文件内容
$content = Get-Content -Path "C:\path\to\file.txt" -Encoding UTF8
# 以 UTF-8 编码写入文件
$content | Set-Content -Path "C:\path\to\file.txt" -Encoding UTF8
行结束符:根据你的操作系统和文件的要求,注意行结束符的使用。Windows 上的行结束符是 \r\n,而 Unix/Linux 上是 \n。
大型文件:对于大型文件,直接在内存中处理整个文件可能会导致性能问题。在这种情况下,你可以考虑逐行读取和处理文件,以减少内存消耗。
# 逐行处理文件
$filePath = "C:\path\to\file.txt"
# 读取文件逐行进行处理
Get-Content -Path $filePath | ForEach-Object {
# 在此处进行逐行处理
# 可以使用 $_ 引用当前行
}
# 逐行写入文件
$filePath = "C:\path\to\file.txt"
# 从输入流逐行写入文件
# 这里示范了通过键盘输入(Ctrl + C 终止)并写入文件,你可以根据实际情况修改
while ($line = Read-Host) {
$line | Add-Content -Path $filePath
}
备份文件:在对文件进行修改之前,最好先备份原始文件,以防止意外修改。
这些是一些常见的注意事项,可以帮助你在 PowerShell 中处理文本时更加谨慎和高效。记住根据你的具体需求来选择适当的方法和参数。
如下为powersehll对文本的内容增删改成方法
替换整个文件中的匹配内容:-replace 支持正则匹配规则。
-replace 是 PowerShell 中用于字符串替换的操作符。它允许对字符串中的匹配项进行替换操作。
-replace 操作符使用正则表达式来查找匹配项,并将其替换为指定的内容。它的语法如下:
$string = "Hello, world!"
$newString = $string -replace "world", "Universe"
Write-Host $newString
#其实明白一行怎么替换了,多行直接使用foreach循环即可解决,然后重新输入到文本即可。
(Get-Content -Path "C:\path\to\file.txt") -replace "oldText", "newText" | Set-Content -Path "C:\path\to\file.txt"
#oldText是要替换的内容,newText是替换后的内容,通过输出一行一行输出到控制台匹配替换后,最后再重新把内容写入到文本中就完成替换了。
#注意:$_.ReadCount 这个表示取当前行的序号,可以根据这个值对指定行进行操作。
替换指定行中的匹配内容:$_.ReadCountou表示取当前行的序号属性值。当目前序号等于3的时候,对此行进行查找替换操作。
$lineNumber = 3
(Get-Content -Path "C:\path\to\file.txt") | ForEach-Object { if ($_.ReadCount -eq $lineNumber) { $_ -replace "oldText", "newText" } else { $_ } } | Set-Content -Path "C:\path\to\file.txt"
在指定行后前插入新的文本:例如在第三行后插入一行。然后把输出结果重新输入到.\1.txt 即可
$file=Get-Content -Path .\1.txt
foreach($i in $file){
$file01=if($i.readcount -eq 3){
$i
Write-Output "这是插入的行"
}
$i
}
$file01 | Set-Content -Path .\1.txt -Force #这个代表输入强制覆盖内容,如果是add-Content 则只是追加到最后。
#打开后文件效果如下
邓鹏邓鹏
邓鹏邓鹏邓鹏
邓鹏邓鹏
这是插入的行
邓鹏邓鹏
$content | Set-Content -Path "C:\path\to\file.txt"
要删除指定的行,你可以使用 Where-Object cmdlet 来选择要保留的行并将其写回文件。以下是一个示例:
$filePath = "C:\path\to\file.txt"
$content = Get-Content -Path $filePath
# 要删除的行号列表,这里删除第三行和第五行
$lineNumbersToDelete = 3, 5
# 选择要保留的行并将其写回文件,使用where排除要显示行,排除后重新写入到文件即可,$lineNumbersToDelete -notcontains $_.ReadCount 表达式用于检查 $lineNumbersToDelete 数组中是否不包含 $_ReadCount 的值。它会返回一个布尔值,如果数组中不存在该值,则为 True,否则为 False。
$content | Where-Object { $lineNumbersToDelete -notcontains $_.ReadCount } | Set-Content -Path $filePath
#示例中,我们首先使用 Get-Content 命令读取文件的内容,并将其存储在 $content 变量中。
然后,我们定义一个包含要删除的行号的整数数组 $lineNumbersToDelete。在示例中,我们删除第三行和第五行,你可以根据需求更改行号列表。
接下来,我们使用 Where-Object cmdlet 来选择要保留的行。$_ 代表当前正在处理的行对象,$_.ReadCount 表示当前行的行号。使用 -notcontains 操作符将不包含在 $lineNumbersToDelete 数组中的行筛选出来。
最后,我们使用 Set-Content 命令将更新后的行写回到文件中。