关于windows:有没有像cmd.exe这样的sed工具?

Is there any sed like utility for cmd.exe?

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

编辑:我正在寻找本机命令行解决方案。


今天PowerShell救了我。

对于grep有:

1
get-content somefile.txt | where { $_ -match"expression"}

对于sed有:

1
get-content somefile.txt | %{$_ -replace"expression","replace"}

有关更多详细信息,请参阅zain naboulsis博客条目。


sed及其ilk包含在几个unix命令包中。

  • 塞格温工作,但是巨大的。
  • Unxutils更苗条。
  • gnuwin32是另一个工作的端口。
  • 另一种选择是AT&T研究公司的Uwin系统。
  • 来自明格的MSY是另一个选择。
  • Linux的Windows子系统是一个最"本机"的选项,但默认情况下它不安装在Windows上;不过它有现成的sedgrep等。
  • https://github.com/mbuilov/sed-windows提供了最新的4.3和4.4版本,与列出的上层端口不同,这些版本支持-z选项。

如果您不想安装任何东西,并且您的系统不是Windows Server,那么您可以使用脚本语言(例如vbscript)。下面是一个毛头,从袖口刺伤它。你的命令行应该是

1
cscript //NoLogo sed.vbs s/(oldpat)/(newpat)/ < inpfile.txt > outfile.txt

其中oldpat和newpat是Microsoft vbscript regex模式。显然,我只实现了替代命令,并假定了一些事情,但是您可以充实它,使其更智能,并了解更多的sed命令行。

1
2
3
4
5
6
7
8
9
10
11
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也提供了sed。


如果您不想安装任何内容(我假设您想将脚本添加到将在其他计算机上运行的某些解决方案/程序等中),可以尝试创建一个VBS脚本(例如,replace.vbs):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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

你就这样运行它:

1
cscript replace.vbs"C:\One.txt""Robert""Rob"

这与"BillWeaver"提供的SED版本类似,但我认为这个版本在特殊字符(">

顺便说一句,我没有写这封信,但我记不起是从哪里弄来的。


超级SED是增强版的SED。对于Windows,这是一个独立的.exe,用于从命令行运行。


1
> (Get-content file.txt) | Foreach-Object {$_ -replace"^SourceRegexp$","DestinationString"} | Set-Content file.txt

这是

1
sed -i 's/^SourceRegexp$/DestinationString/g' file.txt


试试看。它是一个查找和替换文本实用程序,可以在命令批处理程序中使用。

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


你可以试试PowerShell。有get content和set content commandlets内置,您可以使用。


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


我使用CygWin。我遇到了很多人,他们不知道如果您将cygwin二进制文件放在您的路径上,您可以从windows命令shell中使用它们。你不必运行Cygwin的bash。

您还可以查看Microsoft提供的Windows Services for Unix(但仅限于专业版和以上版本的Windows)。


编辑或编辑

另外还有Windows Services for Unix,它附带了许多用于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


您可以查看GNU工具,它们提供(除其他外)基于Windows的服务。


Windows有一个名为repl.bat的助手批处理文件,它具有很大的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

作者是@dbenham from stack overflow and dostips.com

另一个名为findrepl.bat的助手批处理文件为Windows用户提供了GREP的大部分功能,它也是基于Jscript的,也是一个混合批处理文件。它分享了repl.bat的好处

从-https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat下载findrepl

作者是@aacini,来自stack overflow and dostips.com


据我所知,没有任何东西像塞德是捆绑在窗户。但是,SED可用于多种不同形式的Windows,包括作为Cygwin的一部分、如果需要完整的POSIX子系统,或作为win32本机可执行文件(如果只想在命令行上运行SED)。

SED for Windows(gnuwin32项目)

如果它需要Windows自带,那么我唯一能建议的就是使用Windows支持的脚本语言,而不使用诸如vbscript之类的附加组件。


Cygwin工作,但这些公用设施也可用。只需将它们放到您的驱动器上,将目录放到您的路径中,您就拥有了许多友好的Unix实用程序。比赛格温轻(尽管效果也很好)。


我需要一个适用于windows cmd.exe提示的SED工具。EricPement的SED端口只有一个dos.exe,这对我来说非常有用。

它有很好的记录。


这在Vista Ultimate上有效,不一定是专业版。

sed-f命令文件名.cmd file1>file2