【问题标题】:Powershell: Find/Replace pattern of ASCII control charactersPowershell:查找/替换 ASCII 控制字符的模式
【发布时间】:2013-02-26 21:59:22
【问题描述】:

我正在尝试编写一个脚本来搜索文件的内容,并在遇到一组 ASCII 控制字符时插入 CR/LF。

我要替换的字符模式是 [ETX][NUL][STX][ETX][SOH]

$filenames = @(Get-Childitem "E:\VendorFiles\*") $CR = @("[char]3 [char]0 [char]2 [char]3 [char]1") foreach ($file in $filenames) {$outfile = "$file" + ".txt" 获取内容 $file | Foreach 对象 { $_ -替换 $CR,"`r`n" ` -替换 [char]3,"|" ` -替换 [char]1,"{" ` -替换“\\”,“\\” ` } |设置内容-编码“UTF8”$outfile}

【问题讨论】:

    标签: powershell scripting ascii control-characters


    【解决方案1】:

    Michael Sorens' helpful answer 很好地解释了您的方法存在的问题并提供了可行的解决方案。

    提供更简单的选择:

    $CR = ([char[]] (3, 0, 2, 3, 1)) -join ''
    
    • 3, 0, 2, 3, 1 使用要创建的字符的 Unicode 代码点创建一个整数数组。

    • Cast [char[]] 将代码点转换为实际字符 ([char])。

    • -join '' 将字符数组(不带分隔符)连接成一个字符串

    【讨论】:

    • 感谢@mkelement0 的改进!
    【解决方案2】:

    这个表达式:

    @("[char]3 [char]0 [char]2 [char]3 [char]1")
    

    ...用 single 元素创建一个 array。如果你真的想要一个包含 5 个项目的数组,你需要在术语之间使用逗号,但 -replace 无论如何都不支持数组。此外,您的单个元素包含您输入的 literal 字符;不是你所期望的。

    您需要创建一个简单的字符串以提供给-replace;当您处理不可打印的字符时,这会涉及更多。你的想法是对的——你只需要告诉 PowerShell 使用每个表达式上的 $() 符号插入字符串中的代码表达式:

    $CR = "$([char]3)$([char]0)$([char]2)$([char]3)$([char]1)"
    

    【讨论】:

    • 做得很好。 Quibble:-replace 不支持 RHS 上的数组(仅支持一个 regex);但是,LHS - 输入字符串 - 可以是一个数组(在这种情况下,替换操作是对数组元素单独执行的)。
    【解决方案3】:

    我在一个脚本中有一个函数可以做这样的事情。不确定这是否对您有帮助:

    # This function will make a new file that has custom comments
    # it will comment out "rollback tran"
    # it will uncomment out "--commit tran"
    function CommentAndUncomment($TheScript)
    {
        PrintTextAndTime("About to run this SQL file: $TheScript")
        PrintTextAndTime("Will comment out 'rollback tran' and uncomment '--commit tran'")
        $content = Get-Content $TheScript
        $content | 
          ForEach-Object { 
            if ($_ -clike "*ROLLBACK TRAN;*") { 
              $_ -replace "ROLLBACK TRAN;", "--ROLLBACK TRAN;"
            } 
            elseif ($_ -clike "*--COMMIT TRAN;*") { 
              $_ -replace "--COMMIT TRAN;", "COMMIT TRAN;"
            }
            else{
                $_
            }
          } | 
          Set-Content $ModifiedCommentsFile
        echo $ModifiedCommentsFile
        sqlcmd -i $ModifiedCommentsFile
        del $ModifiedCommentsFile
    }
    

    【讨论】:

    • 谢谢,但这没有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 2017-06-15
    • 2014-03-23
    • 2013-08-15
    • 2014-12-03
    相关资源
    最近更新 更多