关闭。此问题不符合 Stack Overflow 准则。它目前不接受答案。我们不允许提出有关书籍、工具、软件库等建议的问题。您可以编辑问题,以便可以用事实和引用来回答它。 7年前关闭。改进这个问题
我想使用 Windows 命令行 (cmd.exe) 以编程方式编辑文件内容。在 *nix 中有 sed 用于此任务。 Windows中有任何有用的本机等价物吗?
今天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。
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 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 脚本(比如说,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
你可以试试powershell。您可以使用内置的 get-content 和 set-content 命令行开关。
sed
所做的贡献最小的两件事 ;-)。 -replace
运算符可能是一个更好的建议。
我使用 Cygwin。我遇到很多人没有意识到如果将 Cygwin 二进制文件放在 PATH 上,则可以在 Windows Command shell 中使用它们。您不必运行 Cygwin 的 Bash。
您还可以查看 Microsoft 提供的 Windows Services for Unix(但仅限于专业版及更高版本的 Windows)。
试试放屁.exe。它是一个查找和替换文本实用程序,可用于命令批处理程序。
http://sourceforge.net/projects/fart-it/
埃德林或编辑
另外还有适用于 Unix 的 Windows 服务,它带有许多适用于 windows 的 unix 工具。 http://technet.microsoft.com/en-us/interopmigration/bb380242.aspx
更新 12/7/12 在 Windows 2003 R2、Windows 7 和Server 2008 等以上被基于 UNIX 应用程序的子系统 (SUA) 作为附加组件取代。但您必须下载实用程序:http://www.microsoft.com/en-us/download/details.aspx?id=2391
有一个名为 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
据我所知,没有什么像 sed 与 windows 捆绑在一起的。但是,sed 以几种不同的形式可用于 Windows,包括作为 Cygwin 的一部分,如果你想要一个完整的 POSIX 子系统,或者作为一个 Win32 本机可执行文件,如果你想在命令行上运行 sed。
Sed for Windows (GnuWin32 Project)
如果它需要原生于 Windows,那么我唯一可以建议的另一件事是使用 Windows 支持的脚本语言,无需附加组件,例如 VBScript。
我需要一个适用于 Windows cmd.exe 提示符的 sed 工具。 Eric Pement's port of sed to a single DOS .exe 对我很有效。
很好documented。
sed
而提出的解决方案对我不起作用。我改用了它,它运行良好:(Get-Content myFile.txt) -replace 'foo', 'bar' | Out-File -encoding ASCII myFile.txt
(这是用于将整个文件中的文本 'foo' 替换为文本 'bar'。这取自 stackoverflow.com/a/20999154/4441211