делать textwrap и dedent в Windows Powershell (или dotNet, иначе .net) - PullRequest
2 голосов
/ 13 сентября 2009

Фон

В Python есть функции textwrap и dedent. Они делают в значительной степени то, что вы ожидаете от любой строки, которую вы поставляете.

textwrap.wrap (text [, width [, ...]])

Переносит один абзац в текст (строку), поэтому длина каждой строки не должна превышать ширину символов. Возвращает список выходных строк без заключительных переносов.

textwrap.dedent (текст)

Удалите все общие начальные пробелы из каждой строки в тексте.

http://docs.python.org/library/textwrap.html

Вопрос:

Как это сделать в Windows PowerShell (или с методами .NET, которые вы вызываете из PowerShell)?

Ответы [ 3 ]

3 голосов
/ 13 сентября 2009

Это небрежный код ...

#requires -version 2.0
    function wrap( [string]$text, [int]$width ) {
    $i=0;
    $text.ToCharArray() | group { [Math]::Floor($i/$width); (gv i).Value++ } | % { -join $_.Group }
}

function dedent( [string[]]$text ) {
    $i = $text | % { $_ -match "^(\s*)" | Out-Null ; $Matches[1].Length } | sort | select -First 1
    $text -replace "^\s{$i}"
}
1 голос
/ 24 июля 2010

Глядя на результаты в python по адресу http://try -python.mired.org / , выясняется, что правильный алгоритм разделяется по границам слова, а не извлекает из текста подстроки фиксированной длины.

function wrap( [string]$text, [int]$width = 70 ) {
  $line = ''

  # Split the text into words.
  $text.Split( ' '.ToCharArray( ) ) | % {
    # Initialize the first line with the first word.
    if( -not $line ) { $line = $_ }
    else {
      # For each new word, try to add it to the current line.
      $next = $line + ' ' + $_

      # If the new word goes over the limit,
      #  return the last line and start a new one.
      if( $next.Length -ge $width ) { $line; $line = $_ }
      # Otherwise, use the updated line with the new word.
      else { $line = $next }
    }
  }

  # Return the last line, containing the remainder of the text.
  $line
}

И вот альтернативная реализация для dedent.

function dedent( [string[]]$lines ) {
  # Find the shortest length of leading whitespace common to all lines.
  $commonLength = (
    $lines | % {
      $i = 0
      while( $i -lt $_.Length -and [char]::IsWhitespace( $_, $i ) ) { ++$i }
      $i
    } | Measure-Object -minimum
  ).Minimum

  # Remove the common whitespace from each string
  $lines | % { $_.Substring( $commonLength ) }
}

Надеюсь, их большая детализация обеспечит лучшую ясность:)

1 голос
/ 13 сентября 2009

Я думаю, вы должны создать утилиту CLI с таким поведением и настроить ее так, как вам нравится. А затем просто используйте это как команду в вашей оболочке. Возможно, вам также понадобится добавить скрипт в PATH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...