Powershell:替换所有以相同Unicode字符开头的不同子字符串(正则表达式?)
Posted
技术标签:
【中文标题】Powershell:替换所有以相同Unicode字符开头的不同子字符串(正则表达式?)【英文标题】:Powershell: Replace all occurrences of different substrings starting with same Unicode char (Regex?) 【发布时间】:2022-01-16 12:55:54 【问题描述】:我有一个字符串:
[33m[TEST][90m [93ma wonderful testorius line[90m ([37mbite me[90m) which ends here.
您看不到它(因为当我发布它时,*** 会删除它)但是每个 [xxm
之前都有一个特殊的 Unicode 字符,其中 xx
是一个变量号,[
以及 @987654326 @ 是固定的。您可以在这里找到特殊字符:https://gist.githubusercontent.com/mlocati/fdabcaeb8071d5c75a2d51712db24011/raw/b710612d6320df7e146508094e84b92b34c77d48/win10colors.cmd
所以,它是这样的(特殊字符在这里用$显示):
$[33m[TEST]$[90m $[93ma wonderful testorius line$[90m ($[37mbite me$[90m) which ends here.
现在,我想删除此行中的所有 $[xxm
子字符串,因为它仅用于彩色监视器输出,但不应保存到日志文件中。
所以预期的结果应该是:
[TEST] a wonderful testorius line (bite me) which ends here.
我尝试使用 RegEx,但我不理解它(可能由于特殊的字符和开放的括号而更加令人困惑)并且我无法在正常的 .Replace ("this","with_that")
操作中使用通配符。
我怎样才能做到这一点?
【问题讨论】:
.Replace( )
字符串方法不知道regex是什么,需要使用-replace
操作符或者直接调用[regex]::Replace( )
好的,但我无法理解 RegEx 并且已经尝试过在线生成器。也许我的测试字符串太混乱了。我应该输入哪个表达式?
尚不清楚文本的字面含义以及您的预期结果。
我都添加了。 $ 代表特殊字符。
【参考方案1】:
在这个简单的例子中,下面的-replace
操作就可以了,但请注意,这不足以稳健地删除ANSI / Virtual Terminal escape sequences的所有变体: p>
# Sample input.
# Note: `e is used as a placeholder for ESC and replaced with actual ESC chars.
# ([char] 0x1b)
# In PowerShell (Core) 7+, "..." strings directly understand `e as ESC.
$formattedStr = '`e[33m[TEST]`e[90m `e[93ma wonderful testorius line`e[90m (`e[37mbite me`e[90m) which ends here.' -replace '`e', [char] 0x1b
# \x1b is a regex escape sequence that expands to an ESC char.
$formattedStr -replace '\x1b\[\d*m'
一般而言,建议在生成此类用于显示格式的字符串的程序上寻找选项,以使它们改为输出纯文本字符串,这样就不需要在事后去除转义序列。
【讨论】:
您,先生,拯救了我的一天!!!非常感谢! 您能否将其添加到您的 PowerShell 解决方案中:$formattedStr -replace "\x1B\[\d+m"
(从朋友那里得到)因为 \x1B 似乎是 $([char] 27) 所指的转义字符,因此是更直。
好点,@tar,谢谢 - 答案已更新。 (我过于狭隘地关注 PowerShell 的 字符串插值。在 regex 中,\x1b
确实可以用来表示 ESC,这也允许切换到 single - 带引号的字符串 ('...'
),在处理正则表达式时通常更可取。另外请注意,我使用的是\d*
而不是\d+
,因为<esc>[m
在技术上是一个有效的ANSI 转义序列。 以上是关于Powershell:替换所有以相同Unicode字符开头的不同子字符串(正则表达式?)的主要内容,如果未能解决你的问题,请参考以下文章
powershell PowerShell脚本,用于替换Web应用程序中网站集中所有网站中的所有徽标。