将<M>替换为文件</space>的所有行中的<space>

时间:2014-02-26 20:41:36

标签: powershell powershell-v3.0

我有一个嵌入^ M的日志文件。我想用一个空格替换^ M. 我尝试过这方面的变种:

(Get-Content C:\temp\send.log) | Foreach-Object {$_ -replace "^M", ' '} | Set-Content C:\temp\send.out  

输出文件包含一个换行符,其中每个^ M都是,而不是我想要的... ... 我试图解决的问题涉及检查文件的最后$ cnt行:

$new = Get-Content $fn | Select-Object -Last $cnt;
$new

当我显示$ new时,^ M被解释为CR / LF 如何删除/替换^ M?感谢您的任何指示......

3 个答案:

答案 0 :(得分:0)

听起来^ M没有被你的-replace方法替换,很可能替换方法试图在字符串的开头替换大写字母M(^)。打开文件后,^ M将被解释为回车符。

也许在显示内容之前尝试替换回车符(^ M):

(Get-Content C:\temp\send.log) | 
    Foreach-Object {$_ -replace "`r", ' '} | 
    Set-Content C:\temp\send.out

$new = Get-Content $fn | Select-Object -Last $cnt;
$new.replace("`r"," ")

答案 1 :(得分:0)

这可以像转义^字符一样简单吗?如果您只需要文件的最后$ count行,则可以在Get-Content上使用-Tail参数。根据您是否需要匹配^ M作为区分大小写,您可以选择-creplace而不是-replace。

Get-Content $inputfile -Tail $count | ForEach-Object { $_ -creplace '\^m',' ' } | Set-Content $outputfile

答案 2 :(得分:0)

这不是一个答案,但既然你要了几个指针,这可能有助于把事情做好。

试试这个:

$new = Get-Content $fn | Select-Object -Last $cnt;
$new
$new.gettype()
$new[0].gettype()

我希望你能看到$ new是一个对象数组,$ new [0]是一个字符串。我建议$ new [0]不包含CR或LF或CRLF或类似的东西。我要建议,当你要求显示全新的$ new时,你得到的是CRLF的每个字符串($ new [0]后跟$ new [1] ......)作为分隔符插入。

如果我是对的,用空格替换CR或CRLF并不会对你有任何好处。它是输出到文件的CRLF,阻止您成功。

这是我解决问题的方法。