在 powershell 中编辑特定符号之间的文本

Edit text between specific symbols in powershell

我想用引号将部分 xhtml 文件引起来。这是一个没有标记的故事对话。如果是对话,它总是以括号中的名字结尾。所以,我想找到所有包含左括号“(”的段落,并用另一个符号将 ( 和前面的 <p> 之间的所有内容括起来。

如果一行看起来像这样;

<p> sentence (name)</p>

...然后我想用引号将 ( 和前面的 <p> 之间的所有内容括起来,所以它看起来像这样:

<p> "sentence" (name)</p>

重要的是我不理会像这样的台词,因为它们不是对话:

<p> sentence</p>

我在 powershell 中设置了基础知识,就像我以前对这些文件所做的工作一样,见下文,但我不确定如何将内容包含在“”中而不覆盖它。这是我尝试过的:

Get-ChildItem 'C:\path\*.xhtml' -Recurse | ForEach {
(Get-Content $_ | ForEach { $_ -replace '\<p\>*\(' , '\<p\>\"*\"\(' }) |
Set-Content $_
}

不幸的是,我似乎弄错了,因为这只更改了我的一个文件,这是唯一一个带有 ( 的异常值,紧跟在开始标记之后,但忽略了末尾带括号的所有其他行:

<p>(TL: Sorry for a bit of late release)</p>

更改为:

 \<p\>\"*\"\(TL: Sorry for a bit of late release)</p>

导致 xhtml 文件不可读。我担心我的方法可能完全错误,并且希望就如何进行这项工作提供一些意见。感谢您抽出时间。

我的猜测是我们可能想要添加多个捕获组,然后在其中收集我们的数据,并根据需要替换,例如,用这个表达式:

(<p>)(\s*)([^(]+?)(\s*)(\(.*\))(<\/p>)

开始替换为:

""

Demo

建议

Tsingyi 的完整代码现在如下所示:

Get-ChildItem 'C:\path*.xhtml' -Recurse | ForEach { (Get-Content $_ | ForEach { $_ -replace '(<p>)(\s*)([^(]+?)(\s*)((.*))(<\/p>)' , '""' }) | Set-Content $_ }

LotPings 建议:

为了不在连续运行中重复插入 ",第三组也应该排除它 =>

-replace '(<p>)(\s*)([^("]+?)(\s*)(\(.*\))(<\/p>)','""'