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

时间:2019-06-16 00:52:55

标签: regex powershell replace xhtml

我想将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文件不可读。我担心我的方法可能完全是错误的,并且希望获得有关如何进行此工作的一些意见。谢谢您的宝贵时间。

1 个答案:

答案 0 :(得分:3)

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

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

开始替换为:

$1$2"$3"$4$5$6

Demo

建议

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

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

LotPings建议:

要在连续运行时不重复插入“,第三组也应排除它=>

-replace '(<p>)(\s*)([^("]+?)(\s*)(\(.*\))(<\/p>)','$1$2"$3"$4$5$6'