当前位置:首页 > Powershell语法 > 正文内容

Powershell基于文本字符串截取及提取语法-12

邓鹏10个月前 (01-13)Powershell语法470

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 对文本进行增删改操作时,有一些需要注意的事项。以下是一些常见的注意事项:

  1. 文件编码:确保在读取或写入文件时指定正确的文件编码。默认情况下,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 命令将更新后的行写回到文件中。


扫描二维码推送至手机访问

版权声明:本文由PowerShell中文社区发布,如需转载请注明出处。

本文链接:https://www.powershell.com.cn/?id=18

分享给朋友:

“Powershell基于文本字符串截取及提取语法-12” 的相关文章

Powershell管道符常见过滤操作方式-11

Powershell管道符常见过滤操作方式-11

使用 PowerShell 管道符时,有一些需要注意的事项,请参考以下列表:管道的方向:PowerShell 中的管道是从左到右进行数据流动的。即,左侧命令的输出被传递给右侧命令进行处理。请确保您正确理解和安排命令的顺序。输出格式:管道可以将数据传递给下一个命令进行处理,但输出的格式可能会发生变化。...

Powershell命令查找系统文件或者目录方法-15

Powershell命令查找系统文件或者目录方法-15

PowerShell 中使用命令查找指定的目录和文件时,需要注意以下几点:使用 Get-ChildItem 命令:Get-ChildItem 是 PowerShell 中用于获取文件和文件夹列表的命令。你可以使用该命令来查找特定目录中的文件和文件夹。指定目标路径:在命令中指定要查找的目标路径,可以是...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。