cmd.exe 是不是有类似 sed 的实用程序? [关闭]

Posted

技术标签:

【中文标题】cmd.exe 是不是有类似 sed 的实用程序? [关闭]【英文标题】: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。 相关:***.com/questions/60034/… 如果您只想从文件中删除某些行,请使用 FIND /? 【参考方案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 命令包中。

Cygwin 有效,但非常庞大。 UnxUtils 更苗条。 GnuWin32 是另一个可用的端口。 另一种选择是 AT&T Research 的 UWIN system。 来自 MinGw 的 MSYS 是另一种选择。 Windows Subsystem for Linux 是一个最“原生”的选项,但默认情况下它没有安装在 Windows 上;不过,它具有开箱即用的sedgrep 等。 https://github.com/mbuilov/sed-windows 提供最新的 4.3 和 4.4 版本,与列出的上层端口不同,它们支持 -z option

如果您不想安装任何东西并且您的系统不是 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-content 和 set-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。我的语言很草率。我编辑了我的评论以解决您指出的问题。

以上是关于cmd.exe 是不是有类似 sed 的实用程序? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

W7系统cmd,实用指令

Windows cmd指令大全

如何通过命令行实用程序操作文本:grep、cut、awk、sed 或 BBEdit(Grep 查找选项)

WIN10 突然跳出 CMD 好像在部署啥东西,大神给看看

dos命令之window10程序控制命令

为啥 IPC::Open3 调用 cmd.exe 而不是请求的程序?