在 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>)','""'
我想用引号将部分 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>)','""'