Цель
Используя PowerShell, найдите строку в файле, запустите простой скрипт преобразования строки и замените исходную строку новой строкой в том же файле
Подробнее
- Файл представляет собой файл Markdown с одним или несколькими блоками HTML внутри.
- Цель состоит в том, чтобы сделать весь файл Markdown без HTML.
- Pandoc - это инструмент преобразования HTML-кода в Markdown из командной строки, который легко преобразует HTML в Markdown.
- Скрипт преобразования - это скрипт Pandoc.
- Только Pandoc не может преобразовать файл Markdown, который включает HTML, в Markdown.
- Каждый HTML-блок a представляет собой одну длинную строку без разрывов строки (см. Пример ниже).
- HTML-код немного грубоват и иногда недействителен; несмотря на это, Pandoc успешно справляется с большинством преобразований. Это может быть не актуально.
- Я не могу изменить тот факт, что файл изначально создавался как часть Markdown / part HTML, что HTML иногда недопустим, или что каждый HTML-блок находится в одной строке.
- PowerShell требуется, потому что это язык сценариев, который поддерживает моя команда.
Файл примера смешанного кода Markdown / HTML; большинство HTML недействительно
# Heading 1
Text
# Heading 2
<h3>Heading 3</h3><p>I am all on one line</h><span><div>I am not always valid HTML</div></span><br><h4>Heading 4<h4><ul><li>Item<br></li><li>Item</li><ul><span></span><img src="url" style="width:85px;">
# Heading 3
Text
# Heading 4
<h2>Heading 1</h2><div>Text</div><h2>Heading 2</h2><div>Text</div>
# Heading 5
<div><ul><li>Item</li><li>Item</li><li>Item</li></ul></div><code><pre><code><div>Code line 1</div><div>Code line 2</div><div>Code line 3</div>
Текст
Код для скрипта преобразования
pandoc -f html -t 'markdown_strict-raw_html-native_divs-native_spans-bracketed_spans' --atx-headers
Попытка
Я окружил каждый блок HTML тегами <start>
и <end>
с целью извлечь текст между этими тегами с помощью регулярного выражения, запустить на нем скрипт Pandoc и заменить исходный текст. Мой план состоял в том, чтобы запустить цикл foreach
, чтобы перебирать каждый блок один за другим.
Эта попытка преобразовывает HTML в Markdown, но не возвращает исходную Markdown вместе с ним:
$file = 'file.md'
$regex = '<start>.*?<end>'
$a = Get-Content $file -Raw
$a | Select-String $regex -AllMatches | ForEach-Object {$_.Matches.Value} | pandoc -f html -t 'markdown_strict-raw_html-native_divs-native_spans-bracketed_spans' --atx-headers
Эта неудачная попытка выполнить замену, но возвращает только оригинальный файл без изменений:
$file = 'file.md'
$regex = '<start>.*?<end>'
$content = Get-Content $file -Raw
$a = $content | Select-String $regex -AllMatches
$b = $a | ForEach-Object {$_.Matches } | Foreach-Object {$_.Value} | Select-Object | pandoc -f html -t 'markdown_strict-raw_html-native_divs-native_spans-bracketed_spans' --atx-headers
$content | ForEach-Object {
$_ -replace $a,$b }
Я изо всех сил пытаюсь выйти за рамки этих попыток. Я новичок в PowerShell. Если этот подход полностью неверен, я был бы рад узнать. Спасибо за любой совет.