我有一个使用ConvertTo-Csv
cmdlet导出的制表符分隔的csv文件。导出时,它将每个字段用引号括起来。我试图删除这些引号(我不想删除字段中的那些)。我试过这个并没有用。
(Get-Content $root\$filename) | % {$_ -replace('"`t"', "`t")} | Set-Content $root\$filename
值打印如下" MASSP"由制表符分隔。如果它是" M" ASSP"我想删除外面的双引号并在字母后面保存一个" M"。
答案 0 :(得分:4)
尝试以下方法:
(Get-Content $root\$filename) |
% { ($_ -replace '^"|"$|(?<=\t)"|"(?=\t)', '') -replace '""', '"' } |
Set-Content $root\$filename
- 虽然问题中的-replace('"`t"', "`t")
恰好在语法上有效,但它表明您错误地认为-replace
需要方法语法进行调用;但是,-replace
是运算符
- 在正则表达式参数中,由于您使用单引号字符串,因此正则表达式转义规则适用,因此标签必须表示为\t
。
- 与我最初的想法不同, 可以在单个管道中读取和写入同一个文件,如OP本人所示,并在评论中由Frode F.指出:将Get-Content $root\$filename
括在括号中可确保将文件作为整体预先和立即关闭进行读取,从而允许{{1覆盖它。
功能
该方法使用2次传递:
Set-Content
与第一个字段^"
"
匹配任何字段的开头(?<=\t)"
,但是匹配第一个字段。"
匹配任何字段的结束引用,但最后一个。"(?=\t)
匹配最后一个字段"$
。"
加倍 - 将被单个实例替换。