Powershell 使用.Replace()操作文件中每行的第一个字符

Powershell 使用.Replace()操作文件中每行的第一个字符,powershell,Powershell,假设我有一个文本文件123.txt 我的目标是通过使用Get Culture将每行的第一个字符大写。这是我的尝试: $str = gc C:\Users\Administrator\Desktop\123.txt #Split each line into an array $array = $str.split("`n") for($i=0; $i -lt $array.Count; $i++) { #Returns O and F: $text = (Get-Cultur

假设我有一个文本文件123.txt

我的目标是通过使用Get Culture将每行的第一个字符大写。这是我的尝试:

$str = gc C:\Users\Administrator\Desktop\123.txt

#Split each line into an array
$array = $str.split("`n")

for($i=0; $i -lt $array.Count; $i++) {
    #Returns O and F:
    $text = (Get-Culture).TextInfo.ToTitleCase($array[$i].Substring(0,1))

    #Supposed to replace the first letter of each array with $text
    $array[$i].Replace($array[$i].Substring(0,1), $text) >> .\Desktop\finish.txt
}
结果:

一,二,三 四,五,六

我理解。Replace is会替换当前数组中出现的每个字符,这就是为什么我确保它只将数组的第一个字符替换为$array[$I]。Substring0,1,但这不起作用

尝试以下操作:

Get-Content C:\Users\Administrator\Desktop\123.txt | ForEach-Object {
  if ($_) {
    $_.Substring(0, 1).ToUpper() + $_.Substring(1)
  } else {
    $_
  }
} > .\Desktop\finish.txt
Get Content逐行读取输入文件,并通过管道发送每一行(去掉行终止符)

ForEach对象处理关联脚本块中的每一行,其中$\表示当前的行:

if$测试行是否为非空,即是否至少有1个字符;如果不是,else块只通过空行。 $\ Substring0,1.ToUpper将行的第一个字符转换为大写,隐式使用当前区域性和单个字符,这相当于应用Get-culture.TextInfo.ToTitleCase。 +$\子字符串1追加行的其余部分。 写入输出文件只需要>rater than>>,因为整个管道的输出是一次写入的


这不起作用的原因是您正在替换角色

$array[$i].Substring(0,1)
。。。但是您正在对整个数组元素使用Replace方法

$array[$i].Replace(...
这里的数组元素是一个字符串,等于输入的一行。因此,它将替换该角色的每一次出现

获取内容,除非在默认情况下使用-Raw参数将文本作为字符串数组返回。因此,您应该能够使用我使用的这个正则表达式替换ToString.ToUpper-Get Culture方法没有问题

正则表达式解释: ^这是一个锚。它指定字符串的开头 \w匹配一个单词字符-通常是a-z、a-z、0-9
请参阅mklement0的注释以了解更为集中的^\p{Ll}和进一步的解释

$text+$array[$i].substring1>.\Desktop\finish.txt如果我对这一点的理解正确,-replace将尝试替换字符串中的每个字符,但仅当它是实际的字母或数字时才完成替换?@PotatoUser'^\w'表示在字符串的开头^查找单词字符字母和数字,而不是空格,并且只查找其中一个,因为其中没有重复代码。因此它只替换每个字符串的第一个字符。@PotatoUser:-replace原则上会替换它找到的所有匹配项,但在这种情况下,由于正则表达式锚定在输入的开头,它只匹配一次,即如果第一个字符是单词字符\w;您可以使用^\p{Ll}使这一点更为突出,它只会匹配Unicode小写字母。@mklement0谢谢-由于该部分不清楚而编辑。关于\w-的附加信息,我不知道。@gms0ulman:谢谢更新;我删除了\w信息以及我以前的评论,因此这里再次以更完整的形式删除了它:.NET正则表达式支持Unicode,因此单词字符\w不仅仅是ASCII范围内的ux、a-z、a-z、0-9(仅表示英文字母和数字),而是包含所有字母和数字;e、 g.'u'-match'\w'也是$True,所以'᠓' -匹配'\w',其中᠓ 是蒙古语数字,三个字符U+18131。
$array[$i].Replace(...
$str = gc C:\Users\Administrator\Desktop\123.txt

foreach($line in $str){
    $line -replace '^\w', $line[0].ToString().ToUpper() >> .\Desktop\finish.txt
}