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 命令包中。
sed
、grep
等。
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
来实现功能,批处理的swift
和doesn'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 的实用程序? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章