【问题标题】:Is there any sed like utility for cmd.exe? [closed]cmd.exe 是否有类似 sed 的实用程序? [关闭]
【发布时间】:2010-09-12 17:48:50
【问题描述】:

我想使用 Windows 命令行 (cmd.exe) 以编程方式编辑文件内容。在 *nix 中有 sed 用于此任务。 Windows 中是否有任何有用的原生等效项?

【问题讨论】:

  • “本地”是什么意思???可安装以在 cmd.exe 中工作,还是无需安装即可工作?如果是前者,请参阅下面引用的 GnuWin32;如果是后者,没有。没有为 Windows 预装本机 sed。
  • 本地我的意思是在所有窗口上运行而无需安装其他东西的解决方案。
  • 留下 cmd.exe 并改用 PowerShell。
  • 如果您只想从文件中删除某些行,请使用 FIND /?

标签: windows sed cmd


【解决方案1】:

今天 powershell 救了我。

对于grep,有:

get-content somefile.txt | where { $_ -match "expression"}

select-string somefile.txt -pattern "expression"

对于sed,有:

get-content somefile.txt | %{$_ -replace "expression","replace"}

有关替换 PowerShell 函数的更多详细信息,请参阅this Microsoft article

【讨论】:

  • 另外:如果你想从普通cmd调用它,只需@powershell -Command "get-content..." 即可。唯一需要注意的是,您必须转义引号: ... -Command "get-content ... \"expression\",..."
  • @Tarc AFAIR,您可以在命令中使用单引号并使用双引号代替命令
  • 我今天尝试在一个文件上删除某些地方引号之间的一些东西,结果发现输出的文件几乎是原始文件的两倍。原因似乎是这种方法改变了文件中换行符的处理方式,使用“\r\n”而不是“\n”。
  • 由于 \r\n 而加倍意味着您的文件纯粹由换行符组成。这是真正的原因:encoding.
  • @and-bri (Get-Content c:\temp\test.txt).replace('[MYID]', 'MyValue') |设置内容 c:\temp\test.txt
【解决方案2】:

sed(及其同类)包含在几个 Unix 命令包中。

如果您不想安装任何东西并且您的系统不是 Windows Server 系统,那么您可以为此使用脚本语言(例如 VBScript)。下面是一个粗暴的,即兴的刺伤它。你的命令行看起来像

cscript //NoLogo sed.vbs s/(oldpat)/(newpat)/ < inpfile.txt > outfile.txt

其中 oldpat 和 newpat 是 Microsoft vbscript regex patterns。显然我只实现了替代命令并假设了一些事情,但您可以充实它以更智能并了解更多sed 命令行。

Dim pat, patparts, rxp, inp
pat = WScript.Arguments(0)
patparts = Split(pat,"/")
Set rxp = new RegExp
rxp.Global = True
rxp.Multiline = False
rxp.Pattern = patparts(1)
Do While Not WScript.StdIn.AtEndOfStream
  inp = WScript.StdIn.ReadLine()
  WScript.Echo rxp.Replace(inp, patparts(2))
Loop

【讨论】:

  • 这不是我想要的,但是我相信对 VBS 的依赖是最简单的解决方案。
  • GnuWin32 is 一个本地解决方案,如果本地是指设计为在“正常”Windows 环境中运行(与 CygWin 不同)。试一试,你会开始期待它们出现在你使用的每个 Windows 系统上。 !!!
  • 适用于我的情况!另外,不要忘记 "//NoLogo" cscript 选项。
  • 如果这是“现成的”,想知道您的其他代码是什么样的!太棒了,谢谢。
  • 可以使用 JScript 完成类似的正则表达式搜索和替换实用程序。 JScript 优于 VBScript 的优点是它可以在单个脚本中轻松地与批处理相结合,从而使该实用程序更易于在批处理或命令行上下文中使用。 A robust hybrid JScript/batch utility called REPL.BAT is available。它有许多命令行选项。完整的文档嵌入在脚本中。它当然没有完整的 sed 功能,但即便如此,它还是相当强大的。
【解决方案3】:

UnxUtils 为 Win32 提供 sed,GNUWin32 也是如此。

【讨论】:

    【解决方案4】:

    如果您不想安装任何东西(我假设您想将脚本添加到将在其他机器上运行的某个解决方案/程序/等中),您可以尝试创建一个 vbs 脚本(比如说,replace. vbs):

    Const ForReading = 1
    Const ForWriting = 2
    
    strFileName = Wscript.Arguments(0)
    strOldText = Wscript.Arguments(1)
    strNewText = Wscript.Arguments(2)
    
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.OpenTextFile(strFileName, ForReading)
    
    strText = objFile.ReadAll
    objFile.Close
    strNewText = Replace(strText, strOldText, strNewText)
    
    Set objFile = objFSO.OpenTextFile(strFileName, ForWriting)
    objFile.Write strNewText
    objFile.Close
    

    然后你像这样运行它:

    cscript replace.vbs "C:\One.txt" "Robert" "Rob"
    

    和“bill weaver”提供的sed版本差不多,但是我觉得这个在特殊(' > )字符方面更友好。

    顺便说一句,这不是我写的,但我不记得我从哪里得到的。

    【讨论】:

      【解决方案5】:
      > (Get-content file.txt) | Foreach-Object {$_ -replace "^SourceRegexp$", "DestinationString"} | Set-Content file.txt
      

      这是行为

      sed -i 's/^SourceRegexp$/DestinationString/g' file.txt
      

      【讨论】:

      • 完美运行。注意:“get-content”上的括号确保以后调用“set-content”时文件不会被使用。
      • 在 cmd 中是否有类似的可能?了解这仅适用于 pwsh
      • 'SourceRegexp' 是否可以被任何可能的正则表达式替代?这在 power shell 中真的有效吗?
      【解决方案6】:

      Super Sed 是 sed 的增强版。对于 Windows,这是一个独立的 .exe,用于从命令行运行。

      【讨论】:

        【解决方案7】:

        你可以试试powershell。您可以使用内置的 get-contentset-content 命令行开关。

        【讨论】:

        • 这可能是 PowerShell 中对 sed 所做的贡献最小的两件事 ;-)。 -replace 运算符可能是一个更好的建议。
        【解决方案8】:

        我使用Cygwin。我遇到很多人没有意识到如果将 Cygwin 二进制文件放在 PATH 上,则可以在 Windows Command shell 中使用它们。您不必运行 Cygwin 的 Bash。

        您还可以查看 Microsoft 提供的 Windows Services for Unix(但仅限于专业版及更高版本的 Windows)。

        【讨论】:

          【解决方案9】:

          试试放屁.exe。它是一个查找和替换文本实用程序,可用于命令批处理程序。

          http://sourceforge.net/projects/fart-it/

          【讨论】:

          • 如果我真的不能使用像 *nix 这样的 shell,我更喜欢这个,因为它是一个没有依赖关系的小型独立 exe。
          【解决方案10】:

          您可以安装 Cygwin (http://www.cygwin.com/) 并从那里使用 sed。

          【讨论】:

            【解决方案11】:

            edlin 或编辑

            另外还有用于 Unix 的 Windows 服务,它带有许多用于 Windows 的 unix 工具。 http://technet.microsoft.com/en-us/interopmigration/bb380242.aspx

            2012 年 12 月 7 日更新 在 Windows 2003 R2、Windows 7 和 Server 2008 等中,上述内容被基于 UNIX 应用程序的子系统 (SUA) 作为附加组件取代。但是您必须下载实用程序: http://www.microsoft.com/en-us/download/details.aspx?id=2391

            【讨论】:

            • 两者在 64 位版本的 Windows 上都不再存在。
            【解决方案12】:

            您可以查看GNU Tools,他们在 Windows 上提供(除其他外)sed。

            【讨论】:

              【解决方案13】:

              有一个名为repl.bat 的Windows 辅助批处理文件,它具有SED 的大部分功能,但doesn't require any additional download 或安装。它是一个混合批处理文件,使用Jscript 来实现功能,批处理的swiftdoesn't suffer from the usual poison characters 也是如此,并且可以轻松处理空行。

              从-https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat下载repl

              替代链接 - https://www.dostips.com/forum/viewtopic.php?f=3&t=6044

              作者是来自堆栈溢出和dostips.com的@dbenham

              另一个名为findrepl.bat 的帮助批处理文件为Windows 用户提供了GREP 的大部分功能,它也是基于Jscript,同样是一个混合批处理文件。它共享 repl.bat 的好处

              从-https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat下载findrepl

              作者是来自堆栈溢出和dostips.com的@aacini

              【讨论】:

              • repl 的 Dropbox 链接已关闭。你有辅助链接吗?
              【解决方案14】:

              据我所知,没有什么像 sed 与 windows 捆绑在一起的。但是,sed 以几种不同的形式可用于 Windows,包括作为 Cygwin 的一部分,如果您想要完整的 POSIX 子系统,或者作为 Win32 本机可执行文件,如果您只想在命令行上运行 sed。

              Sed for Windows (GnuWin32 Project)

              如果它需要原生于 Windows,那么我唯一能建议的另一件事是使用 Windows 支持的脚本语言,无需附加组件,例如 VBScript。

              【讨论】:

                【解决方案15】:

                Cygwin 有效,但 these 实用程序也可用。只需将它们放在您的驱动器上,将目录放入您的路径中,您就会拥有许多友好的 unix 实用程序。恕我直言,Cygwin 更轻量级(尽管效果也一样)。

                【讨论】:

                  【解决方案16】:

                  我需要一个适用于 Windows cmd.exe 提示符的 sed 工具。 Eric Pement's port of sed to a single DOS .exe 非常适合我。

                  还不错documented

                  【讨论】:

                  • 问题是关于 Windows (cmd.exe) 而不是 DOS
                  • @royhowie:我明白了。尽管其中一些答案可能对某人有用,但我同意这个问题本身并不适合 SO。 OTOH,我觉得没有资格推荐批量删除。
                  • 在这种情况下,我认为很难包含答案的基本部分,因为基本部分是链接页面上托管的 .exe 文件。我完全理解对链接腐烂的担忧,我只是不确定如何使这个独立成 SO。
                  • 感谢您的收获,a_horse_with_no_name。我的语言很草率。我编辑了我的评论以解决您指出的问题。
                  猜你喜欢
                  • 1970-01-01
                  • 2010-10-10
                  • 2010-12-12
                  • 1970-01-01
                  • 2019-04-19
                  • 2020-12-26
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-06-21
                  相关资源
                  最近更新 更多