PowerShell:如何测试文本行是否包含换行符或回车符?

8

我该如何测试文本文件的第一行是否以 \r 或 \n 结尾?

我尝试了各种类似以下的版本。我不确定导入到 PowerShell 中的字符串(文件的第一行)是否包含看不见的字符。我还尝试使用 StreamReader 方法读取行,但无济于事。

$master = Get-Content $masterFilename | Select-Object -First 1
if ($master.Contains("\r|\n"))
    {
        write-host "you betcha, there's a carriage return or line feed"
    }

谢谢你。


5
在PowerShell中,换行符和回车符分别用\n`r`表示。 - Jan Chrbolka
1个回答

9

Get-Content会根据这些字符将您的文件转换为字符串数组。在开始测试内容时,这些字符已被剥离。如果您只是想查找换行符的存在(您的条件似乎不关心它遇到了什么),测试从Get-Content返回的行数就足够了。

If((Get-Content $masterFilename).Count -gt 1){"you betcha, there's a carriage return or line feed"}

我相信一旦您看到它,我会为此添加内容。我认为您可能需要修改问题以更具体。 Get-Content有一个-Raw开关,可以保留换行符号,这更接近于您想要的目标。我不确定字符串方法contains是否支持通配符。我知道它不支持正则表达式。
如果您只是对一行感到好奇,那么如上所述,-Raw将是开始的地方。考虑以下十六进制表示的文本文件。它只是单词hello后跟一个换行符。
68 65 6c 6c 6f 0d 0a

现在我将把这段文本作为一个字符串读入,并测试字符串的结尾是否有回车符和换行符。请注意,我没有使用反引号进行转义,而是使用了正则表达式的特殊字符。(两种方式都可以工作,只是需要注意。)
(Get-Content c:\temp\test.txt -Raw) -match "\r\n$"
True

请注意,大多数写入文件的PowerShell cmdlet都会留下一个尾随换行符。因此,无论您有多少行,以上代码片段对于像Set-Content这样的内容都是正确的。

如果您的文件只有一行,并以回车符或换行符结尾,会发生什么? - DanL
感谢您的额外编辑。您最后的代码片段就是我的解决方案!我很感激,Matt。 - STWilson
我找不到绕过完全原始加载大文件的方法。在我的情况下,似乎使用Get-Content c:\temp\reallybigfile.csv -Encoding byte -ReadCount 1000 | Select-Object -First 1至少会获取第一行,然后测试该数组是否包含10或13,即LF和CR的十进制代码,可能是我的最终答案。 - STWilson
1
@STWilson,你在这个大文件中具体要查找什么?使用[System.IO.File]::ReadAllText()或者[System.IO.File]::ReadAllBytes()比使用Get-Content更快。 - Matt
([System.IO.File]::ReadAllBytes($aBigOne) | Select-Object -First 1000) -Contains 10 是快速而优雅的。在第一行中没有匹配项的情况下,限制可以避免对巨大文件进行无果的搜索。 - STWilson
我的情况是:从PowerShell调用的SQL查询中,行是否以CR结尾会得到反映。 - STWilson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接