在文件中查找转义字符

时间:2017-07-30 02:24:32

标签: string powershell design-patterns escaping

我试图在文件中找到回车符(\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

2 个答案:

答案 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"}