Что такое Windows-эквивалент команды tr
в Linux?
Например, tr
может заменить все двоеточия символом новой строки. Можно ли это сделать в Windows?
$ echo $PATH | tr ':' '\n'
/usr/local/bin
/usr/bin
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\
Да, замены нет. Чтобы разделить переменную 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< /а>
Эквивалент tr в современной ОС Windows (начиная с Windows 7):
powershell -noprofile -command "$Input | foreach { write-output $_.Replace(<from-string> , <to-string> )}"
Итак, в вашем случае:
path | powershell -noprofile -command "$Input | foreach { write-output $_.Replace(';',\"`r`n\")}"
В качестве альтернативы просто установите Cygwin, чтобы получить большинство команд unix.
`n
в Заменить
В 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\
Если у вас включена подсистема 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\
...
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}}
Как насчет того, чтобы версия 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
, чтобы получить доступ к инструментам.
Насколько я понял, замены tr
нет, но это работает просто и незабываемо для вашего варианта использования (в PowerShell):
echo $env:PATH.Replace(';',"`r`n")
Есть уродливый пакетный взлом:
echo "%path:;="&echo "%"
%path%
, но заменяет каждое ;
на "&echo "
, в результате чего получается пара команд echo
. Поместите строку в командный файл (с echo on
), чтобы увидеть эффект.
Похожие вопросы
Связанные вопросы
Новые вопросы
linux
ВНИМАНИЕ: Все вопросы по Linux должны быть связаны с программированием; те, которые не будут закрыты. Используйте этот тег, только если ваш вопрос касается программирования с использованием API-интерфейсов Linux или поведения, специфичного для Linux, а не только потому, что вы запускаете свой код в Linux. Если вам нужна поддержка Linux, вы можете попробовать https://unix.stackexchange.com или сайт Stack Exchange конкретного дистрибутива Linux, например https://askubuntu.com или https://elementaryos.stackexchange.com/.
echo "$PATH" | ...
Удачи.