【问题标题】: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"}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-14
        • 2020-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-09
        相关资源
        最近更新 更多