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 脚本替换 sc 配置

powershell PowerShell脚本,用于替换Web应用程序中网站集中所有网站中的所有徽标。

powershell Powershell脚本遍历提升列表中的所有项目,并替换图片和链接。这遍历了所有

替换给定 unicode 字符串中的所有表情符号

中文字符替换为其unicode编码值小3的字符

Sitecore Powershell 批量替换richtext 字段内容