Редактировать текст между определенными символами в powershell - PullRequest
2 голосов
/ 16 июня 2019

Я хочу заключить части файлов 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 нечитаемым. Я боюсь, что мой подход может быть неправильным, altв целом и хотел бы получить вклад в том, как сделать эту работу.Спасибо за использование вашего времени.

1 Ответ

3 голосов
/ 16 июня 2019

Я предполагаю, что мы могли бы захотеть добавить несколько групп захвата, затем собрать наши данные в них и заменить, однако, по желанию, например, следующим выражением:

(<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 советует:

Чтобы не вставлять "повторно в последовательных прогонах, 3-я группа также должна исключить его =>

-replace '(<p>)(\s*)([^("]+?)(\s*)(\(.*\))(<\/p>)','$1$2"$3"$4$5$6'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...