Что такое Windows-эквивалент команды tr в Linux?

Например, tr может заменить все двоеточия символом новой строки. Можно ли это сделать в Windows?

$ echo $PATH | tr ':' '\n'
/usr/local/bin
/usr/bin
15
HattrickNZ 27 Мар 2015 в 04:48
2
Я не понимаю - знаете ли вы команду Windows и просите ее эквивалент для Linux или знаете команду Linux и просите ее?
 – 
Amadan
27 Мар 2015 в 04:52
1
В качестве практики «исключить целый класс ошибок из моего кода» вы всегда хотите заключать имена переменных в двойные кавычки, то есть echo "$PATH" | ... Удачи.
 – 
shellter
27 Мар 2015 в 05:00

8 ответов

Лучший ответ


в PowerShell мы разделили
см. этот пример

$a=( echo $env:Path | Out-String )
$a -split ";"

Перед :

%SystemRoot%\system32\WindowsPowerShell\v1.0\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System
32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Prog
ram Files (x86)\ATI Technologies\ATI.ACE\Core-Static;C:\Program Files (x86)\QuickTime\QTSystem\;C:\Program Files\Micros
oft SQL Server\110\Tools\Binn\;C:\Program Files (x86)\010 Editor;C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web P
ages\v1.0\;C:\Program Files (x86)\Windows Kits\8.0\Windows Performance Toolkit\;C:\Program Files\Microsoft\Web Platform
 Installer\;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Microsoft Visual Studio\Common\Tools\Win
NT;C:\Program Files (x86)\Microsoft Visual Studio\Common\MSDev98\Bin;C:\Program Files (x86)\Microsoft Visual Studio\Com
mon\Tools;C:\Program Files (x86)\Microsoft Visual Studio\VC98\bin;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Com
mon Files\Intel\WirelessCommon\

После:

> %SystemRoot%\system32\WindowsPowerShell\v1.0\ C:\Windows\system32
> C:\Windows C:\Windows\System32\Wbem
> C:\Windows\System32\WindowsPowerShell\v1.0\ C:\Program
> Files\Intel\WiFi\bin\ C:\Program Files\Common
> Files\Intel\WirelessCommon\ C:\Program Files (x86)\ATI
> Technologies\ATI.ACE\Core-Static C:\Program Files
> (x86)\QuickTime\QTSystem\ C:\Program Files\Microsoft SQL
> Server\110\Tools\Binn\ C:\Program Files (x86)\010 Editor C:\Program
> Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\ C:\Program Files
> (x86)\Windows Kits\8.0\Windows Performance Toolkit\ C:\Program
> Files\Microsoft\Web Platform Installer\
> C:\Windows\System32\WindowsPowerShell\v1.0\ C:\Program Files
> (x86)\Microsoft Visual Studio\Common\Tools\WinNT C:\Program Files
> (x86)\Microsoft Visual Studio\Common\MSDev98\Bin C:\Program Files
> (x86)\Microsoft Visual Studio\Common\Tools C:\Program Files
> (x86)\Microsoft Visual Studio\VC98\bin C:\Program
> Files\Intel\WiFi\bin\ C:\Program Files\Common
> Files\Intel\WirelessCommon\
8
Soheil Hashemi 27 Мар 2015 в 04:55
3
Еще проще набрать: $ env: Path -split ";"
 – 
josmith42
9 Июл 2018 в 17:05

Да, замены нет. Чтобы разделить переменную PATH на строки в Windows PowerShell, используйте:

PS >$env:Path -split ';'
C:\WINDOWS\system32
C:\WINDOWS
...

Или замените разделитель явной новой строкой (CRLF):

PS >$env:Path -creplace ';', "`r`n"
C:\WINDOWS\system32
C:\WINDOWS
...

Примечания:

  • Обратные кавычки не оцениваются в строках, заключенных в одинарные кавычки.
  • Powershell также работает на MacOS и Linux. Но есть отличия. Чтобы написать независимо от платформы, ваш код может выглядеть так: $env:PATH -creplace [IO.Path]::PathSeparator, [Environment]::NewLine
  • Использование RegEx с -replace: https://ss64.com/ps/syntax-regex.html< /а>
3
Gerrit Viehmann 23 Янв 2022 в 00:16

В Windows нет прямого эквивалента tr, поэтому я создал командлет, который можно использовать как команду tr (из: http://satob.hatenablog.com/entry/2019/06/18/013811):

function tr {
  Param(
    [Parameter(ValueFromPipeline=$true,Mandatory=$true)]
    [string] $TargetString,
    [Parameter(Mandatory=$true)]
    [string] $FromString,
    [Parameter(Mandatory=$true)]
    [string] $ToString
  )
  begin {
    # Split string into character array
    # [-split ""] splits a surrogate pair into two invalid characters,
    # so the code below is not suitable for this purpose
    # $FromStringArray = $FromString -split "";
    # $FromStringArray = $FromStringArray[1..($FromStringArray.length-2)];
    $FromStringArray = @();
    $FromStringBytes = [Text.Encoding]::UTF32.GetBytes($FromString);
    for ($i=0; $i -lt $FromStringBytes.length; $i+=4) {
         $FromStringArray += [Text.Encoding]::UTF32.GetString($FromStringBytes, $i, 4);
    }

    $ToStringArray = @();
    $ToStringBytes = [Text.Encoding]::UTF32.GetBytes($ToString);
    for ($i=0; $i -lt $ToStringBytes.length; $i+=4) {
         $ToStringArray += [Text.Encoding]::UTF32.GetString($ToStringBytes, $i, 4);
    }
  }
  process {
    for ($i=0; $i -lt $FromStringArray.Length -and $i -lt $ToStringArray.Length; $i++) {
        $TargetString = $TargetString.Replace($FromStringArray[$i],$ToStringArray[$i]);
    }
    $TargetString
  }
}

Вы можете использовать этот командлет следующим образом:

PS > echo $env:Path | tr -FromString ";" -ToString "`n"
C:\WINDOWS\system32
C:\WINDOWS
C:\WINDOWS\System32\Wbem
C:\WINDOWS\System32\WindowsPowerShell\v1.0\
C:\WINDOWS\System32\OpenSSH\
2
SATO Yusuke 19 Июн 2019 в 18:26

Если у вас включена подсистема Windows для Linux (WSL), вы можете просто вызвать wsl tr из PowerShell или CMD.

WSL позволяет вызывать команды Linux из командной строки Windows лишь с незначительным снижением производительности. Это функция Windows 10 уже несколько лет, и она просто должна быть включен.

Простой пример:

PS> Write-Output "1:2:3x" | wsl tr ':' ',' | wsl tr -d 'x'
1,2,3

Чтобы воссоздать пример OP Linux в CMD:

C:\> echo %path% | wsl tr ";" "\n"
C:\Windows\system32
C:\Windows
C:\Windows\System32\Wbem
...

В PowerShell требуется немного больше цитирования / экранирования:

PS> echo $env:Path | wsl -d TmpTumble tr "\;" "\\n"
C:\Windows
C:\Windows\System32\Wbem
C:\Windows\System32\WindowsPowerShell\v1.0\
...
8
NotTheDr01ds 24 Июл 2021 в 18:12
Однострочный WSL: if (!([bool](Get-Command -Name tr -EA SilentlyContinue))) {if ([bool](Get-Command -Name wsl -EA SilentlyContinue)) {Function AliasTr {wsl tr $args};Set-Alias tr AliasTr}}
 – 
PotatoFarmer
29 Июл 2021 в 03:04

Как насчет того, чтобы версия tr для Windows работала в Windows? Не нужно изучать новый синтаксис!

Ссылка: https://learn.microsoft.com/en-us/ окна/wsl/установить-win10

В Windows 10 можно включить подсистему Windows Linux и после этого установить облегченную версию Ubuntu.

Инструменты, аналогичные WSL для Windows 7, также существуют здесь: https: / /www.microsoft.com/en-us/download/details.aspx?id=2391

Плюсы: вы получаете tr, оболочку bash и весь арсенал инструментов командной строки Linux.
Минусы: вам нужно запустить оболочку WSL bash, чтобы получить доступ к инструментам.

0
biocyberman 2 Апр 2019 в 16:05

Насколько я понял, замены tr нет, но это работает просто и незабываемо для вашего варианта использования (в PowerShell):

echo $env:PATH.Replace(';',"`r`n")
3
Martin Tournoij 31 Июл 2022 в 19:18

Есть уродливый пакетный взлом:

echo "%path:;="&echo "%"
8
Stephan 26 Сен 2015 в 20:08
1
@ RaúlSalinas-Monteagudo повторяет переменную %path%, но заменяет каждое ; на "&echo ", в результате чего получается пара команд echo. Поместите строку в командный файл (с echo on), чтобы увидеть эффект.
 – 
Stephan
11 Мар 2019 в 18:23