我们可以将哪个标记传递到Get-Content
以显示\r\n
或\n
等control characters?
我要做的是确定文件的行结尾是Unix还是Dos样式。我试过简单地运行Get-Content
,它没有显示任何行结尾。我也尝试将Vim与set list
一起使用,无论行尾是什么,它都会显示$
。
我想用PowerShell做这件事,因为那将非常有用。
答案 0 :(得分:7)
一种方法是使用Get-Content的编码参数,例如:
Get-Content foo.txt -Encoding byte | % {"0x{0:X2}" -f $_}
如果您有PowerShell Community Extensions,则可以使用Format-Hex命令:
Format-Hex foo.txt
Address: 0 1 2 3 4 5 6 7 8 9 A B C D E F ASCII
-------- ----------------------------------------------- ----------------
00000000 61 73 66 09 61 73 64 66 61 73 64 66 09 61 73 64 asf.asdfasdf.asd
00000010 66 61 73 0D 0A 61 73 64 66 0D 0A 61 73 09 61 73 fas..asdf..as.as
如果你真的想看到" \ r \ n"在输出中,而不是BaconBits所建议的,但你必须使用-Raw参数,例如:
(Get-Content foo.txt -Raw) -replace '\r','\r' -replace '\n','\n' -replace '\t','\t'
输出:
asf\tasdfasdf\tasdfas\r\nasdf\r\nas\tasd\r\nasdfasd\tasf\tasdf\t\r\nasdf
答案 1 :(得分:5)
以下是自定义函数Debug-String
,它可视化字符串中的控制字符:
在可用的情况下,使用PowerShell自己的`
- 前缀转义序列表示法(例如,`r
表示CR),其中可以使用本机PowerShell转义,
回退到caret notation(例如,带代码点0x4
的ASCII范围控制字符 - 发送结束 - 表示为^D
)。
-CaretNotation
开关在插入符号中表示所有 ASCII范围控制字符,这样可以在Linux和{{{{{}}上提供类似于cat -A
的输出1}}在macOS / BSD上。所有其他控制字符,即ASCII范围之外的 (跨越代码点的ASCII范围cat -et
- 0x0
)以{{的形式表示1}},其中0x7F
是十六进制。代码点的表示,最多6位数;例如,`u{<hex>}
是Unicode char。 U+0085
,NEXT LINE控件字符。现在,可扩展字符串(<hex>
)也支持此表示法,但仅限于PowerShell Core 。
应用于您的用例,您需要使用 PSv3 + ,因为使用了`u{85}
来确保整个读取文件;没有它,关于行结尾的信息将会丢失):
"..."
两个简单的例子:
使用PowerShell的转义序列表示法。请注意,这看起来只是一个无操作:“...”字符串中的`-prefixed sequence创建实际的控制字符。
Get-Content -Raw
Get-Content -Raw $file | Debug-String
在Linux上使用PS> "a`ab`t c`0d`r`n" | Debug-String
,输出类似于a`ab`t c`0d`r`n
:
-CaretNotation
cat -A
PS> "a`ab`t c`0d`r`n" | Debug-String -CaretNotation
源代码:a^Gb^I c^@d^M$
为简洁起见,我没有在上面提供基于评论的帮助;这是:
Debug-String
答案 2 :(得分:2)
这是使用正则表达式替换的一种方式:
function Printable([string] $s) {
$Matcher =
{
param($m)
$x = $m.Groups[0].Value
$c = [int]($x.ToCharArray())[0]
switch ($c)
{
9 { '\t' }
13 { '\r' }
10 { '\n' }
92 { '\\' }
Default { "\$c" }
}
}
return ([regex]'[^ -~\\]').Replace($s, $Matcher)
}
PS C:\> $a = [char[]](65,66,67, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)
PS C:\> $b = $a -join ""
PS C:\> Printable $b
ABC\1\2\3\4\5\6\7\8\t\n\11\12\r