我有一个文件ids.txt
646646646
995775665
564548984
566466464
553553663
144235535
为什么这两个代码之间的输出是不同的:
PS > [regex]::Replace($file,'^([0-9])([0-9]+)([0-9])$','$3$2$1')
646646646 595775669 464548985 466466465 353553665 544235531
PS> $file -replace '^([0-9])([0-9]+)([0-9])$','$3$2$1'
646646646
595775669
464548985
466466465
353553665
544235531
感谢抱歉我的英语不好
$_ofs = $Ofs
$ofs = "`r`n"
[regex]::Replace($file,'^([0-9])([0-9]+)([0-9])$','$3$2$1','multiline')
$ofs = $_ofs
646646646
995775665
564548984
566466464
553553663
544235531
为什么结果不正确?
答案 0 :(得分:1)
PowerShell将$ file转换为字符串,以便将其分配给[regex] :: Replace()方法的[string]参数。此字符串的结果值取决于$ OFS全局变量的值,该变量当前显示为空格''。
这应该给你与-replace:
相同的结果$file | foreach { [regex]::Replace($_,'^([0-9])([0-9]+)([0-9])$','$3$2$1') }
更新回答:
CLR [regex] :: Replace()方法与`r(回车)不匹配。请参阅this answer。
你可以设置$ OFS =“`n”,但在脚本中设置全局变量并不是一个好主意。
如果确实需要在多行字符串上执行替换(而不是在我之前的答案中按行进行),那么您还有其他一些选项:
1:将文件作为单个字符串读取并删除CR: $ file =(Get-Content'。\ file.txt'-Raw)-replace“`r”
2:每行读取文件并加入LF: $ file =(Get-Content'。\ file.txt')-join“`n”
然而,通常认为“流式传输”数据是最佳做法。这样,用户可以在操作期间获得的反馈。很多时候,您会看到执行大型磁盘操作时写得不好的应用程序似乎挂起,让用户不知道是否存在问题。对于小文件,它确实没有区别,尽管我仍然建议你尽可能使用-replace运算符。
另外需要注意的是,[regex] :: Replace()总是会返回单个字符串,无论是单行还是多行,例如如果你传递一个包含10个字符串的数组,字符串就会被连接起来,作为单个字符串传递给方法,并返回一个字符串。
但是,-replace运算符返回给定的内容。如果你传递一个字符串,它会返回一个字符串;如果你传递一个数组(在你的情况下,大概是),它会返回一个数组。