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

时间:2018-03-15 21:44:44

标签: powershell

说我有一个文本文件OrderedDict([('Sample Code', 'Vendor Sample ID'), ('Donor ID', 'Vendor Subject ID'), ('Format', 'Material Format'), ('Sample Type', 'Sample Type'), ('Age', 'Age'), ('Gender', 'Gender'), ('Ethnicity/ Race', 'Race'), ('Organ', 'Organ'), ('Pathological Diagnosis', 'Diagnosis'), ('Detailed Pathological Diagnosis', 'Detailed Diagnosis'), ('Clinical Diagnosis/Cause of Death', 'Detailed Diagnosis option 2'), ('Dissection', 'Dissection'), ('Quantity (g, ml, or ug)', 'Quantity'), ('HIV', 'HIV'), ('HEP B', 'HEP B')]) OrderedDict([('Sample Code', 'Vendor Sample ID'), ('Donor ID', 'Vendor Subject ID'), ('Sample Type', 'Sample Type'), ('Ethnicity/ Race', 'Race'), ('Organ', 'Organ'), ('Pathological Diagnosis', 'Diagnosis'), ('Detailed Pathological Diagnosis', 'Detailed Diagnosis'), ('Clinical Diagnosis/Cause of Death', 'Detailed Diagnosis option 2'), ('Dissection', 'Dissection'), ('Quantity (g, ml, or ug)', 'Quantity'), ('HIV', 'HIV'), ('HEP B', 'HEP B'), ('tata', ['Gender', 'Age', 'Material Format'])])

123.txt

我的目标是使用one,two,three four,five,six 将每行的第一个字符大写。这是我的尝试:

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 }

我知道One,twO,three Four,Five,six替换了当前数组的每一个匹配项,这就是为什么我确保它只用.Replace()替换数组的第一个字符,但是这并不是#39;工作。

2 个答案:

答案 0 :(得分:2)

尝试以下方法:

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

  • ForEach-Object处理关联脚本块中的每一行,其中$_表示手头的行:

    • if ($_)测试该行是否为非空,即是否至少有1个字符;如果没有,else块只是通过空行。
    • $_.Substring(0, 1).ToUpper()将行的第一个字符转换为大写,隐式使用当前文化(使用单个字符,这相当于应用Get-Culture).TextInfo.ToTitleCase())。
    • + $_.Substring(1)附加其余部分。
  • 只需要> rater而不是>>来写入输出文件,因为整个管道的输出都是一次写入的。

答案 1 :(得分:2)

这不起作用的原因是因为你要替换角色......

$array[$i].Substring(0,1)

...但是你在整个数组元素上使用了Replace方法

$array[$i].Replace(...

这里数组元素是一个字符串,等于输入的一行。所以它将取代该角色的每一次出现。

Get-Content(除非您使用-Raw参数)默认情况下将文本作为字符串数组返回。所以你应该可以使用这个正则表达式替换(我使用ToString().ToUpper() - Get-Culture方法没有错误)

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

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

正则表达式解释:
^是一个锚点。它指定"字符串的开头"
\w匹配单词字符 - 通常是a-z,A-Z,0-9
有关更具针对性的^\p{Ll}here的详细信息,请参阅mklement0的评论here