Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 将^M替换为<;空间>;在文件的所有行中_Powershell_Powershell 3.0 - Fatal编程技术网

Powershell 将^M替换为<;空间>;在文件的所有行中

Powershell 将^M替换为<;空间>;在文件的所有行中,powershell,powershell-3.0,Powershell,Powershell 3.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 $cn

我有一个日志文件,其中嵌入了^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?谢谢你的指点

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

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

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


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

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

这不是一个答案,但既然你问了一些建议,这可能有助于澄清问题

试试这个:

$new = Get-Content $fn | Select-Object -Last $cnt;
$new
$new.gettype()
$new[0].gettype()
我希望您会看到$new是一个对象数组,$new[0]是一个字符串。我将建议$new[0]不包含CR或LF或CRLF或类似的内容。我将建议,当您要求显示$new的全部内容时,您得到的是每个字符串($new[0]后跟$new[1]),其中插入了CRLF作为分隔符

如果我是对的,用空格替换CR或CRLF对你没有任何好处。正是在输出到文件时插入的CRLF阻止了您的成功


这就是我为解决您的问题所做的一切。

很抱歉,我必须在VIM中定期执行类似的操作-您必须使用powershell吗?是的,这是用于处理日志文件的更大PS模块的一部分。它将用于我的多个用户,并且不能保证vim可用。您想替换一组嵌入的回车符还是一组文字
^M
?该文件有
CRLF
行结尾,对吗,作为普通的Windows文本文件?我正试图澄清这个问题——我可以提供一个本机Windows解决方案,但不是特别的powershell。谢谢你的回复,nimizen,但没有乐趣。我的怀疑是,在读取流时,^M被翻译成
r
n,因此对$new(在您的示例中)的处理已经太晚了。另外还有两点。首先,可能需要将“
r
n”替换为空格。反勾号r和反勾号n变为回车和换行。第二点。当您获取包含多行的文本文件的内容时,不会得到单个字符串。您将获得一个字符串数组。你似乎知道这一点,基于你在问题中所做的管道。但是,在这种情况下,我认为设置内容是向输出中添加多行的错误方式。哦,还有第三点,请查看变量$OFS。这就是如何控制PS将多个文本连接到文本文件中的方式。
$new = Get-Content $fn | Select-Object -Last $cnt;
$new
$new.gettype()
$new[0].gettype()