替换文本文件中的垂直条

Replace Vertical bar within a text file

提问人:moveit124 提问时间:9/27/2022 最后编辑:mklement0moveit124 更新时间:10/23/2023 访问量:280

问:

我正在尝试替换 |文本文件中的字符。但我不确定该怎么做,因为批次没有读取|。

powershell -Command "(gc output.txt) -replace '|', ' ' | Out-File -encoding ASCII output.txt"

这需要以下输入:80853||OHNED|Mira

和输出:8 0 8 5 3 | | O H N E D | M i r a

我想要这个输出的位置80853 OHNED Mira

批次中是否有替换 |字符?

编辑 - 在谷歌搜索时,我发现 |字符称为竖线。

PowerShell 替换

评论

2赞 Santiago Squarzon 9/27/2022
管道是正则表达式中的特殊字符,并且是正则表达式兼容运算符。最好,因为您要替换文字管道,因此您应该使用替换字面字符的替换方法:|-replace(gc output.txt -Raw).Replace('|', ' ') ....

答:

2赞 Hackoo 9/27/2022 #1

编辑:这可以完成替换特殊字符的技巧:

@echo off
powershell -Command "(gc input.txt -raw) -replace '([\^&<>\|\(\)!])', ' ' | Out-File output.txt"
start "" output.txt

评论

0赞 moveit124 9/27/2022
这基本上需要输入和输出相同的东西80853||OHNED|Mira80853||OHNED|Mira
0赞 Hackoo 9/27/2022
查看我上次编辑的内容
2赞 mklement0 9/27/2022
在这种情况下只需要逃逸。如果需要将搜索操作数通常视为逐字字符串,请使用 。|[regex]::Escape()
4赞 mklement0 9/27/2022 #2

注意:此答案是在使用 PowerShell CLIpowershell -Command “...”) 的上下文中提供的,但实质上同样适用于 PowerShell 脚本 (*.ps1) 和函数中的代码。
\-eslicing 的替代方法是正则表达式字符[...]),它还允许您匹配多个字符;例如 'a|b&c' -replace '[|&]' -> 'abc'

或者,使用正则表达式字符集 ():[...]Get-ChildItem | Rename-Item -NewName { $_.Name -replace '[?|!&]' }

PowerShell 的 -replace 运算符基于正则表达式;由于您的意图是逐字替换所有字符,因此您必须将 | 转义为 \|,因为这是一个正则表达式元字符(在正则表达式(正则表达式)的上下文中具有特殊含义的字符):||

powershell -Command "(gc output.txt) -replace '\|', ' ' | Out-File -encoding ASCII output.txt"

如果转义单个字符不是一种选择,或者会很麻烦 - 例如,如果你得到一个搜索字符串,你想从字面上看,作为一个整体来对待 - 使用 [regex]::Escape():

powershell -Command "(gc output.txt) -replace [regex]::Escape('|'), ' ' | Out-File -encoding ASCII output.txt"

或者,在简单的情况下,您可以使用 .Replace() 字符串方法,它总是执行逐字替换,因此不需要转义:

powershell -Command "(gc output.txt).Replace('|', ' ') | Out-File -encoding ASCII output.txt"

注意:

  • 与 PowerShell 的运算符不同,键入的 .Replace() 方法区分大小写,在 Windows PowerShell 中始终如此,在 PowerShell (Core) 6+ 中默认如此。[string]

另请参阅:

  • 有关何时使用 PowerShell 的 -replace 运算符与 .NET [string] 类型的 .Replace() 方法,请参阅此答案的底部。

  • 可靠地转义 -replace 搜索正则表达式和/或其替换操作数中的所有元字符,以便将一个或两个都视为逐字字符串,请参阅此答案