当前位置:  开发笔记 > 编程语言 > 正文

是否有像cmd.exe的sed工具?

如何解决《是否有像cmd.exe的sed工具?》经验,为你挑选了10个好方法。

我想使用Windows命令行(cmd.exe)以编程方式编辑文件内容.在*nix中有这个任务的sed.在Windows中有没有有用的等价物?

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



1> Jakub Šturc..:

今天powershell救了我.

因为grep有:

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

而且sed有:

select-string somefile.txt -pattern "expression"

有关更多详细信息,请参阅Zain Naboulsis博客文章.


另外:如果你想从普通cmd调用它,只需@powershell -Command"get-content ..."就可以了.唯一需要注意的是,你必须使用引号:•-Command"get-content ... \"expression \",..."

2> b w..:

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


GnuWin32 _is_是一个原生解决方案,如果是本机你的意思是设计为在"正常"的Windows环境中运行(与CygWin不同).给他们一个尝试,你会开始期待他们在你使用的每个Windows系统上.!
如果这是"袖手旁观",请想知道你的其他代码是什么样的!太棒了,谢谢.
适合我的情况!另外,不要忘记"// NoLogo"cscript选项.
可以使用JScript完成类似的正则表达式搜索和替换实用程序.JScript优于VBScript的优点是可以在单个脚本中轻松地与批处理结合使用,使得实用程序更易于在批处理或命令行上下文中使用.[可以使用称为REPL.BAT的强大的混合JScript /批处理实用程序](http://stackoverflow.com/a/16735079/1012053).它有许多命令行选项.完整文档嵌入在脚本中.它当然没有完整的sed功能,但即便如此,它也非常强大.

3> Adam Hughes..:

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> Rob Kam..:

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



6> 小智..:

试试fart.exe.它是一个可以在命令批处理程序中使用的查找和替换文本实用程序.

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



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

这是行为

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



8> robintw..:

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



9> 小智..:

你可以试试powershell.有获得内容和设置内容命令行开关建立,你可以使用.


这些可能是PowerShell中对"sed"所做的最少贡献的两件事;-).`-replace`运算符可能是一个更好的建议.

10> Brandon DuRe..:

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

您也可以查看Microsoft提供的Windows Services for Unix(但仅限于Professional及以上版本的Windows).

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有