我想将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文件不可读。我担心我的方法可能完全是错误的,并且希望获得有关如何进行此工作的一些意见。谢谢您的宝贵时间。
答案 0 :(得分:3)
我的猜测是,我们可能想要添加多个捕获组,然后在这些捕获组中收集数据,但是可能需要替换,例如,使用以下表达式:
(<p>)(\s*)([^(]+?)(\s*)(\(.*\))(<\/p>)
开始替换为:
$1$2"$3"$4$5$6
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'