【问题标题】:Finding escape character in files在文件中查找转义字符
【发布时间】:2018-01-05 20:07:51
【问题描述】:
我正在尝试在文件中查找回车符 (\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
【问题讨论】:
标签:
string
powershell
design-patterns
escaping
【解决方案1】:
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 在第一个匹配项(如果有)处停止,并返回一个 Boolean 指示是否找到匹配项。
请注意,需要将$_.FullName 而不仅仅是$_ 传递给Get-Content -Raw,以确保不在当前目录中的文件也得到正确处理。
原因是 $_ 尽管是一个携带完整路径信息的 object,但作为 string 绑定到 Get-Content 的 -Path 参数,并且string 只是文件 name,没有路径信息。
这是known pitfall。
【解决方案2】:
短版:
gci -file -rec | ? { (gc $_.FullName -Raw) -match "\n"}