174

我想使用 Windows 命令行 ( cmd.exe ) 以编程方式编辑文件内容。在 *nix 中有用于此任务的sed。Windows中有任何有用的本机等价物吗?

4

16 回答 16

148

今天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 文章

于 2011-05-17T09:35:12.447 回答
105

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

如果您不想安装任何东西并且您的系统不是 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
于 2008-09-24T14:37:54.360 回答
23

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

于 2008-09-24T14:05:15.420 回答
18

如果您不想安装任何东西(我假设您想将脚本添加到将在其他机器上运行的某个解决方案/程序/等中),您可以尝试创建一个 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版本,但我认为这个在特殊(' > < / )字符方面更友好。

顺便说一句,我没有写这个,但我不记得我从哪里得到它。

于 2011-04-20T10:38:50.983 回答
12
> (Get-content file.txt) | Foreach-Object {$_ -replace "^SourceRegexp$", "DestinationString"} | Set-Content file.txt

这是的行为

sed -i 's/^SourceRegexp$/DestinationString/g' file.txt
于 2013-11-05T12:35:37.053 回答
10

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

于 2009-05-26T17:49:20.830 回答
8

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

于 2008-09-24T14:11:24.860 回答
7

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

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

于 2008-09-24T14:11:32.177 回答
7

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

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

于 2012-07-18T21:23:21.863 回答
6

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

于 2008-09-24T14:03:12.633 回答
4

埃德林或编辑

另外还有适用于 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

于 2008-09-24T14:03:27.297 回答
3

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

于 2008-09-24T14:03:38.840 回答
3

有一个名为 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

于 2013-11-05T13:04:14.927 回答
2

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

用于 Windows 的 Sed(GnuWin32 项目)

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

于 2008-09-24T14:08:31.887 回答
1

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

于 2008-09-24T14:06:43.653 回答
0

我需要一个适用于 Windows cmd.exe 提示符的 sed 工具。Eric Pement 将sed移植到单个 DOS .exe对我来说效果很好。

它有据可查

于 2013-04-24T15:17:37.420 回答