Найдите строку в файле, запустите на нем сценарий и замените исходную строку новой строкой с помощью PowerShell. - PullRequest
0 голосов
/ 19 ноября 2018

Цель

Используя 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. Если этот подход полностью неверен, я был бы рад узнать. Спасибо за любой совет.

1 Ответ

0 голосов
/ 19 ноября 2018

Учитывая линейно-ориентированный характер ввода, вы можете построчно обрабатывать входной файл и решать для каждой строки, нуждается ли он в преобразовании:

$file = 'file.md'
(Get-Content $file | ForEach-Object {
  if ($_ -match '^<') { # Is this an HTML line? - you could make this regex stricter
    $_ | pandoc -f html -t 'markdown_strict-raw_html-native_divs-native_spans-bracketed_spans' --atx-headers
  } else { # A non-HTML line, pass through as-is
    $_
  }
}) | Set-Content -Encoding Utf8 $file # be sure to choose the desired encoding

Обратите внимание на (...) вокругконвейер до Set-Content, который гарантирует, что $file будет считан в память полностью перед , что позволяет выполнять обратную запись в тот же файл - обратите внимание, что этот удобный подход несет небольшой риск потери данных,однако, если команда прерывается до завершения записи;всегда сначала создавайте резервную копию входных файлов.

...