【问题标题】:What is the `tr` command in Windows?什么是 Windows 中的 `tr` 命令?
【发布时间】:2015-03-27 01:48:23
【问题描述】:

Windows 中的 tr 命令在 Linux 中的等效项是什么?

例如,tr 可以用换行符替换所有冒号。这可以在 Windows 中完成吗?

$ echo $PATH | tr ':' '\n'
/usr/local/bin
/usr/bin

【问题讨论】:

  • 我不明白 - 你知道 Windows 命令并请求 Linux 等效命令,还是知道 Linux 命令并请求 Windows 命令?
  • 作为“从我的代码中消除一整类错误”的做法,您总是希望用 dbl-quote 引用您的变量名,即 echo "$PATH" | ... 祝您好运。

标签: linux windows cmd tr


【解决方案1】:


在 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\

【讨论】:

  • 输入更简单:$env:Path -split ";"
【解决方案2】:

有一个丑陋的批处理破解:

echo "%path:;="&echo "%"

【讨论】:

  • @RaúlSalinas-Monteagudo 它与%path% 变量相呼应,但将每个; 替换为"&echo ",从而产生几个echo 命令。将该行放入一个批处理文件中(带echo on)看看效果。
【解决方案3】:

现代 Windows O/S(Windows 7 以上)中 tr 的等价物是:

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 命令。

【讨论】:

【解决方案4】:

如果您启用了适用于 Linux 的 Windows 子系统 (WSL),您只需在 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 中,涉及到更多的引用/转义:

PS> echo $env:Path | wsl -d TmpTumble tr "\;" "\\n"
C:\Windows
C:\Windows\System32\Wbem
C:\Windows\System32\WindowsPowerShell\v1.0\
...

【讨论】:

  • WSL One-Liner: 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}}
【解决方案5】:

在 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\

【讨论】:

    【解决方案6】:

    据我所知,tr 的替代品并没有下降,但这对您的用例来说非常简单且令人难忘:

    echo $env:PATH.Replace(';',"`r`n")
    

    【讨论】:

      【解决方案7】:

      实际上在 Windows 上运行 Windows 版本的 tr 怎么样?无需学习新语法!

      链接:https://docs.microsoft.com/en-us/windows/wsl/install-win10

      在 Windows 10 上,可以启用 Windows 子系统 Linux,然后安装轻量级版本的 Ubuntu。

      与 Windows 7 的 WSL 类似的工具也存在于此处:https://www.microsoft.com/en-us/download/details.aspx?id=2391

      优点:您可以获得tr、bash shell 和整个 Linux 命令行工具库。
      缺点:您需要在 WSL bash shell 中运行才能访问工具

      【讨论】:

        【解决方案8】:

        是的,没有替代品。要将 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
        • 使用带有 -replace 的 RegEx:https://ss64.com/ps/syntax-regex.html

        【讨论】:

          猜你喜欢
          • 2015-09-25
          • 1970-01-01
          • 1970-01-01
          • 2011-10-16
          • 2017-02-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-06
          相关资源
          最近更新 更多