我试图在文件中找到回车符(\r
)和新行(\n
),但以下两个语句不返回任何内容:
Get-ChildItem -recurse | Select-String -pattern "\r" | group path | select name
Get-ChildItem -recurse | Select-String -pattern "\n" | group path | select name
但是,标签(\t
)转义字符似乎有效:
Get-ChildItem -recurse | Select-String -pattern "\t" | group path | select name
答案 0 :(得分:6)
Select-String
默认情况下对输入文件的单行进行操作,由于这些行的末尾不包含换行符,因此无法匹配。
换句话说:在指定的正则表达式(-Pattern
)与每个输入行匹配时,默认情况下,换行符序列(换行符)已被剥离。
因此,您必须将每个输入文件作为一个整体读取,以匹配其换行符序列,Get-Content -Raw
(PSv3 +)允许您执行此操作:
Get-ChildItem -Recurse -File | ForEach-Object {
if (Get-Content -Raw $_.FullName | Select-String -Quiet '\r') { $_.Name }
}
Select-String -Quiet
在第一场比赛中停止(如果有),并返回布尔,表示是否找到匹配。
请注意,需要将$_.FullName
而非$_
传递给Get-Content -Raw
,以确保当前目录中的文件也未得到正确处理。
原因是$_
尽管是一个携带完整路径信息的对象,却被绑定为字符串到Get-Content
&#39} -Path
参数,该字符串只是文件 name ,没有路径信息
这是known pitfall。
答案 1 :(得分:0)
简短版本:
gci -file -rec | ? { (gc $_.FullName -Raw) -match "\n"}