How to escape a backslash in Powershell

前端 未结 2 1462
Happy的楠姐
Happy的楠姐 2020-12-11 04:47

I\'m writing a powershell program to replace strings using

-replace \"$in\", \"$out\"

It doesn\'t work for strings containing a backslash,

相关标签:
2条回答
  • 2020-12-11 05:05

    You'll need to either escape the backslash in the pattern with another backslash or use the .Replace() method instead of the -replace operator (but be advised they may perform differently):

    PS C:\> 'asdf' -replace 'as', 'b'
    bdf
    PS C:\> 'a\sdf' -replace 'a\s', 'b'
    a\sdf
    PS C:\> 'a\sdf' -replace 'a\\s', 'b'
    bdf
    PS C:\> 'a\sdf' -replace ('a\s' -replace '\\','\\'), 'b'
    bdf
    

    Note that only the search pattern string needs to be escaped. The code -replace '\\','\\' says, "replace the escaped pattern string '\\', which is a single backslash, with the unescaped literal string '\\' which is two backslashes."

    So, you should be able to use:

    -replace ("$in" -replace '\\','\\'), "$out"
    

    [Note: briantist's solution is better.]

    However, if your pattern has consecutive backslashes, you'll need to test it.

    Or, you can use the .Replace() string method, but as I said above, it may not perfectly match the behavior of the -replace operator:

    PS C:\> 'a\sdf'.replace('a\\s', 'b')
    a\sdf
    PS C:\> 'a\sdf'.replace( 'a\s', 'b')
    bdf
    
    0 讨论(0)
  • 2020-12-11 05:08

    The -replace operator uses regular expressions, which treat backslash as a special character. You can use double backslash to get a literal single backslash.

    In your case, since you're using variables, I assume that you won't know the contents at design time. In this case, you should run it through [RegEx]::Escape():

    -replace [RegEx]::Escape($in), "$out"
    

    That method escapes any characters that are special to regex with whatever is needed to make them a literal match (other special characters include .,$,^,(),[], and more.

    0 讨论(0)
提交回复
热议问题