我想使用 Windows 命令行 ( cmd.exe ) 以编程方式编辑文件内容。在 *nix 中有用于此任务的sed。Windows中有任何有用的本机等价物吗?
16 回答
今天powershell救了我。
因为grep
有:
get-content somefile.txt | where { $_ -match "expression"}
或者
select-string somefile.txt -pattern "expression"
因为sed
有:
get-content somefile.txt | %{$_ -replace "expression","replace"}
有关替换 PowerShell 功能的更多详细信息,请参阅此 Microsoft 文章。
sed
(及其同类)包含在几个 Unix 命令包中。
- Cygwin有效,但非常庞大。
- UnxUtils更苗条。
- GnuWin32是另一个有效的端口。
- 另一种选择是 AT&T Research 的UWIN 系统。
- MinGw 的MSYS是另一种选择。
- 适用于 Linux 的 Windows 子系统是最“原生”的选项,但默认情况下它并未安装在 Windows 上;
sed
但是,它具有grep
开箱即用的等功能。 - https://github.com/mbuilov/sed-windows提供最新的 4.3 和 4.4 版本,与列出的上层端口不同,它们支持
-z
选项
如果您不想安装任何东西并且您的系统不是 Windows Server 系统,那么您可以为此使用脚本语言(例如 VBScript)。下面是一个粗暴的,即兴的刺伤它。你的命令行看起来像
cscript //NoLogo sed.vbs s/(oldpat)/(newpat)/ < inpfile.txt > outfile.txt
其中 oldpat 和 newpat 是Microsoft vbscript 正则表达式模式。显然我只实现了替代命令并假设了一些事情,但您可以充实它以更智能并了解更多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
UnxUtils为 Win32 提供 sed,GNUWin32 也是如此。
如果您不想安装任何东西(我假设您想将脚本添加到将在其他机器上运行的某个解决方案/程序/等中),您可以尝试创建一个 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版本,但我认为这个在特殊(' > < / )字符方面更友好。
顺便说一句,我没有写这个,但我不记得我从哪里得到它。
> (Get-content file.txt) | Foreach-Object {$_ -replace "^SourceRegexp$", "DestinationString"} | Set-Content file.txt
这是的行为
sed -i 's/^SourceRegexp$/DestinationString/g' file.txt
Super Sed是sed的增强版。对于 Windows,这是一个独立的 .exe,用于从命令行运行。
你可以试试powershell。您可以使用内置的get-content和set-content命令行开关。
我使用Cygwin。我遇到很多人没有意识到如果将 Cygwin 二进制文件放在 PATH 上,则可以在 Windows Command shell 中使用它们。您不必运行 Cygwin 的 Bash。
您还可以查看Microsoft 提供的适用于 Unix 的 Windows 服务(但仅限于专业版及更高版本的 Windows)。
试试放屁.exe。它是一个查找和替换文本实用程序,可用于命令批处理程序。
您可以安装 Cygwin ( http://www.cygwin.com/ ) 并从那里使用 sed。
埃德林或编辑
另外还有适用于 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
您可以查看GNU Tools,它们在 Windows 上提供(除其他外) sed。
有一个名为 Windows 的帮助程序批处理文件,repl.bat
它具有 SEDdoesn't require any additional download
或安装的大部分功能。它是一个混合批处理文件,用于Jscript
实现功能等swift
,以及doesn't suffer from the usual poison characters
批处理和轻松处理空白行。
repl
从 - https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat下载
替代链接 - https://www.dostips.com/forum/viewtopic.php?f=3&t=6044
作者是来自堆栈溢出和 dostips.com 的@dbenham
另一个名为的帮助程序批处理文件findrepl.bat
为 Windows 用户提供了很多功能,GREP
它也基于Jscript
混合批处理文件,同样也是一个混合批处理文件。它共享 repl.bat 的好处
findrepl
从 - https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat下载
作者是来自堆栈溢出和 dostips.com 的@aacini
据我所知,没有什么像 sed 与 windows 捆绑在一起的。但是,sed 以几种不同的形式可用于 Windows,包括作为 Cygwin 的一部分,如果你想要一个完整的 POSIX 子系统,或者作为一个 Win32 本机可执行文件,如果你想在命令行上运行 sed。
如果它需要原生于 Windows,那么我唯一可以建议的另一件事是使用 Windows 支持的脚本语言,无需附加组件,例如 VBScript。
Cygwin 有效,但这些实用程序也可用。只需将它们放在您的驱动器上,将目录放入您的路径中,您就会拥有许多友好的 unix 实用程序。Cygwin 的轻量级恕我直言(尽管效果也一样)。
我需要一个适用于 Windows cmd.exe 提示符的 sed 工具。Eric Pement 将sed移植到单个 DOS .exe对我来说效果很好。
它有据可查。