Windows 中的 `tr` 命令是什么?
What is the `tr` command in Windows?
Windows 等同于 Linux 中的 tr
命令是什么?
例如,tr
可以用换行符替换所有冒号。这可以在 Windows 中完成吗?
$ echo $PATH | tr ':' '\n'
/usr/local/bin
/usr/bin
在 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 Server0\Tools\Binn\;C:\Program Files (x86)0 Editor;C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web P
ages\v1.0\;C:\Program Files (x86)\Windows Kits.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
> Server0\Tools\Binn\ C:\Program Files (x86)0 Editor C:\Program
> Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\ C:\Program Files
> (x86)\Windows Kits.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\
有一个丑陋的批处理黑客:
echo "%path:;="&echo "%"
tr 在现代 Windows O/S(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 命令。
在 Windows 上实际拥有 tr
运行ning 的 Windows 版本怎么样?无需学习新语法!
Link: https://docs.microsoft.com/en-us/windows/wsl/install-win10
在 Windows 10 上,可以启用 Windows 子系统 Linux 并随后安装 Ubuntu 的轻量级版本。
Windows7 的 WSL 类似工具也存在于此处:https://www.microsoft.com/en-us/download/details.aspx?id=2391
优点:您可以获得 tr
、bash shell 和整个 Linux 命令行工具库。
缺点:您需要 运行 进入 WSL bash
shell 才能访问工具
Windows 中没有直接的 tr
等价物,所以我制作了一个 cmdlet,您可以像 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
}
}
您可以像这样使用此 cmdlet:
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\
据我所知,tr
的替代品并没有减少,但这对您的用例来说非常简单且令人难忘:
echo $env:PATH.Replace(';',"`r`n")
如果您为 Linux (WSL) 启用了 Windows 子系统,您只需在 PowerShell 或 CMD 下调用 wsl tr
。
WSL 允许人们从 Windows 命令提示符调用 Linux 命令,而只有轻微的性能损失。多年来,它一直是 Windows 10 的一个功能,现在只需要 enabled.
简单示例:
PS> Write-Output "1:2:3x" | wsl tr ':' ',' | wsl tr -d 'x'
1,2,3
要在 CMD 中重新创建 OP 的 Linux 示例:
C:\> echo %path% | wsl tr ";" "\n"
C:\Windows\system32
C:\Windows
C:\Windows\System32\Wbem
...
在 PowerShell 中,还有更多 quoting/escaping 涉及:
PS> echo $env:Path | wsl -d TmpTumble tr "\;" "\n"
C:\Windows
C:\Windows\System32\Wbem
C:\Windows\System32\WindowsPowerShell\v1.0\
...
是的,替换没有下降。要在 Windows PowerShell 上将 PATH 变量拆分成行,请使用:
PS >$env:Path -split ';'
C:\WINDOWS\system32
C:\WINDOWS
...
或者用显式换行 (CRLF) 替换分隔符:
PS >$env:Path -creplace ';', "`r`n"
C:\WINDOWS\system32
C:\WINDOWS
...
备注:
- single-quoted 字符串中不计算反引号。
- Powershell 可在 MacOS 和 Linux 上运行。但也有区别。要编写独立于平台的代码,您的代码可能如下所示:
$env:PATH -creplace [IO.Path]::PathSeparator, [Environment]::NewLine
- 将 RegEx 与 -replace 结合使用:https://ss64.com/ps/syntax-regex.html
Windows 等同于 Linux 中的 tr
命令是什么?
例如,tr
可以用换行符替换所有冒号。这可以在 Windows 中完成吗?
$ echo $PATH | tr ':' '\n'
/usr/local/bin
/usr/bin
在 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 Server0\Tools\Binn\;C:\Program Files (x86)0 Editor;C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web P
ages\v1.0\;C:\Program Files (x86)\Windows Kits.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
> Server0\Tools\Binn\ C:\Program Files (x86)0 Editor C:\Program
> Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\ C:\Program Files
> (x86)\Windows Kits.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\
有一个丑陋的批处理黑客:
echo "%path:;="&echo "%"
tr 在现代 Windows O/S(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 命令。
在 Windows 上实际拥有 tr
运行ning 的 Windows 版本怎么样?无需学习新语法!
Link: https://docs.microsoft.com/en-us/windows/wsl/install-win10
在 Windows 10 上,可以启用 Windows 子系统 Linux 并随后安装 Ubuntu 的轻量级版本。
Windows7 的 WSL 类似工具也存在于此处:https://www.microsoft.com/en-us/download/details.aspx?id=2391
优点:您可以获得 tr
、bash shell 和整个 Linux 命令行工具库。
缺点:您需要 运行 进入 WSL bash
shell 才能访问工具
Windows 中没有直接的 tr
等价物,所以我制作了一个 cmdlet,您可以像 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
}
}
您可以像这样使用此 cmdlet:
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\
据我所知,tr
的替代品并没有减少,但这对您的用例来说非常简单且令人难忘:
echo $env:PATH.Replace(';',"`r`n")
如果您为 Linux (WSL) 启用了 Windows 子系统,您只需在 PowerShell 或 CMD 下调用 wsl tr
。
WSL 允许人们从 Windows 命令提示符调用 Linux 命令,而只有轻微的性能损失。多年来,它一直是 Windows 10 的一个功能,现在只需要 enabled.
简单示例:
PS> Write-Output "1:2:3x" | wsl tr ':' ',' | wsl tr -d 'x'
1,2,3
要在 CMD 中重新创建 OP 的 Linux 示例:
C:\> echo %path% | wsl tr ";" "\n"
C:\Windows\system32
C:\Windows
C:\Windows\System32\Wbem
...
在 PowerShell 中,还有更多 quoting/escaping 涉及:
PS> echo $env:Path | wsl -d TmpTumble tr "\;" "\n"
C:\Windows
C:\Windows\System32\Wbem
C:\Windows\System32\WindowsPowerShell\v1.0\
...
是的,替换没有下降。要在 Windows PowerShell 上将 PATH 变量拆分成行,请使用:
PS >$env:Path -split ';'
C:\WINDOWS\system32
C:\WINDOWS
...
或者用显式换行 (CRLF) 替换分隔符:
PS >$env:Path -creplace ';', "`r`n"
C:\WINDOWS\system32
C:\WINDOWS
...
备注:
- single-quoted 字符串中不计算反引号。
- Powershell 可在 MacOS 和 Linux 上运行。但也有区别。要编写独立于平台的代码,您的代码可能如下所示:
$env:PATH -creplace [IO.Path]::PathSeparator, [Environment]::NewLine
- 将 RegEx 与 -replace 结合使用:https://ss64.com/ps/syntax-regex.html