【问题标题】:Replace special character with double double quotes用双双引号替换特殊字符
【发布时间】:2016-06-13 01:15:37
【问题描述】:

我有一个带有一些特殊字符$ 的文本文件,需要用双双引号替换。我正在使用一个 bat 文件,我在其中调用 powershell.exe 并编写替换命令。下面是命令:

powershell "gc C:\Temp\Test.csv| foreach-object {$_ -replace '$','""""""'}|sc C:\Temp\Test_Replace.csv"

我知道双引号会被双引号转义,因此“”“””相当于“”。但如上面的代码所示,我需要编写 6 个双引号才能获得等效的 2 个引号。我想不通找出原因。

有人可以说明我遗漏的观点吗?

【问题讨论】:

  • -replace 使用正则表达式。转义 $(这是正则表达式中的字符串结尾特殊字符):$_ -replace '\$','""""""'
  • 就个人而言,我将其称为PowerShell.exe 命令行解析器中的错误。序列""被它处理得很奇怪,所以我建议不要使用它,而是使用\"

标签: powershell replace


【解决方案1】:

正如我在 cmets 中所说,我认为它是一个但在 PowerShell.exe 命令行解析器中。当它在引用的上下文中看到"" 时,它不仅会产生文字",还会产生关闭引用的上下文:

CMD> powershell '"1  2""3  4"'
1  2"3 4

如您所见,打印字符串中的 3 分 4 之间只有一个空格。您需要添加额外的双引号来重新打开引用的上下文:

CMD> powershell '"1  2"""3  4"'
1  2"3  4

因此,事实上,您必须重复三次双引号才能产生一个文字双引号字符。

【讨论】:

    【解决方案2】:

    你只需要正确地转义嵌套的双引号。此外,ForEach-Object 不是必需的。将Get-Content 放在表达式中(即括号中),您可以直接使用-replace 运算符。

    powershell -Command "(gc C:\Temp\in.csv) -replace '$','\"\"'|sc C:\Temp\out.csv"
    

    如果您想替换文字 $ 字符而不是在每行的末尾添加双引号,您还需要转义 $,正如 Mathias 指出的那样:

    powershell -Command "(gc C:\Temp\in.csv) -replace '\$','\"\"'|sc C:\Temp\out.csv"
    

    【讨论】:

    • 非常感谢您改进逻辑。我提供的语句完成了这项工作(为每个文字 $ 获取两个双引号)。但不清楚 6 个双引号而不是 4 个如何完成工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 2011-04-12
    • 2023-03-23
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多