cmd.exe是否有sed实用程序?[关闭]


149

我想使用Windows命令行(cmd.exe)以编程方式编辑文件内容。在* nix中有sed用于执行此任务。Windows中是否有任何有用的本地等效项?


1
“本地”是什么意思???可安装以在cmd.exe中工作,还是无需安装就可以工作?如果是前者,请参见下面的GnuWin32。如果是后者,则不会。没有针对Windows的预安装本机sed。
Michael Paulukonis,2009年

6
我的母语是指无需安装其他任何东西即可在所有Windows上运行的解决方案。
2009年

1
将cmd.exe留在后面,改用PowerShell。
Bill_Stewart


如果只想从文件中删除某些行,请使用FIND /?
约翰·亨克尔

Answers:


117

今天,powershell救了我。

因为grep有:

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

要么

select-string somefile.txt -pattern "expression"

并且sed有:

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

有关更多详细信息,请参见Zain Naboulsis博客条目


12
另外:如果要从普通cmd调用它,只需@powershell -Command“获取内容...”即可。唯一的警告是您必须转引号:...-命令“ get-content ... \” expression \”,...”
Tarc 2014年

1
@Tarc AFAIR,您可以在命令中使用单引号,并使用双引号代替该命令

2
我今天在文件上尝试了此操作,以删除某些地方引号之间的某些内容,但发现输出文件的大小几乎是原始文件的两倍。原因似乎是此方法将文件中换行的处理方式更改为使用“ \ r \ n”而不是“ \ n”。
user132278 '16

1
\ r \ n加倍表示您的文件纯粹由换行符组成。这是真正的原因:encoding
阿米特·奈杜

2
@ and-bri(获取内容c:\ temp \ test.txt).replace('[MYID]','MyValue')| 设置内容c:\ temp \ test.txt
AFP_555 '19

94

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

如果您不想安装任何东西,而您的系统不是Windows Server,那么您可以为此使用脚本语言(例如VBScript)。下面是一个粗暴的现成的刺伤。您的命令行看起来像

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

其中oldpat和newpat是Microsoft vbscript regex模式。显然,我仅实现了替代命令并进行了一些假设,但是您可以充实它,使其变得更聪明并更了解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

1
这并不是我想要的,但是我相信对VBS的依赖是最轻的解决方案。
JakubŠturc08年

7
GnuWin32 本机解决方案,如果您是本机的话,则意味着它旨在在“正常” Windows环境中运行(与CygWin不同)。试试看,您将开始期望它们可以在您使用的每个Windows系统上使用。!!!
Michael Paulukonis,2009年

3
适用于我的情况!另外,不要忘记“ // NoLogo” cscript选项。
Marko Dumic 2010年

4
如果这是“现成的”,请怀疑您的其他代码是什么样子!太好了,谢谢。
Sabuncu 2011年

2
可以使用JScript完成类似的regex搜索和替换实用程序。与VBScript相比,JScript的优势在于可以在单个脚本中轻松地将其与批处理结合使用,从而使该实用程序更易于在批处理或命令行上下文中使用。一个强大的混合JScript / batch实用程序称为REPL.BAT可用。它具有许多命令行选项。完整的文档嵌入在脚本中。它当然不具备完整的sed功能,但即使如此,它也非常强大。
dbenham


17

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

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



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

这是行为

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

1
完美运作。注意:“ get-content”上的括号可确保在以后调用“ set-content”时不再使用该文件。
卡夫

在cmd中有可能类似的东西吗?在了解这仅适用于pwsh
Ferroao

SourceRegexp是否被任何可能的正则表达式所取代?在电源外壳中真的有效吗?
scjorge




6

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

您可能还会研究Microsoft 提供的Unix Windows服务(但仅适用于Windows专业版和更高版本)。


4

edlin或编辑

另外还有适用于Unix的Windows服务,其中包含许多用于Windows的Unix工具。 http://technet.microsoft.com/zh-cn/interopmigration/bb380242.aspx

更新12/7/12在Windows 2003 R2,Windows 7和Server 2008等中,以上内容已替换为基于UNIX的应用程序子系统(SUA)作为附件。但是您必须下载实用程序:http : //www.microsoft.com/zh-cn/download/details.aspx?id=2391


5
在Windows的64位版本上,两者都不存在了。
乔伊(Joey)


3

有一个名为Windows的帮助程序批处理文件,repl.bat它具有SED的大部分功能,但doesn't require any additional download也可以安装。它是一个混合批处理文件,用于Jscript实现功能以及swift,并且doesn't suffer from the usual poison characters用于批处理并轻松处理空行。

repl从以下位置下载-https: //www.dropbox.com/s/qidqwztmetbvklt/repl.bat

作者是@dbenham,来自堆栈溢出和dostips.com

另一个名为的帮助程序批处理文件findrepl.bat为Windows用户提供了很多功能,GREP并且还基于Jscript混合批处理文件并且同样如此。它具有repl.bat的优点

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

作者是@aacini,来自堆栈溢出和dostips.com


用于repl的保管箱链接已关闭。您是否有辅助链接?
维沙尔·阿南德

2

据我所知,windows不会捆绑sed。但是,sed可用于Windows的几种不同形式,包括作为Cygwin的一部分(如果要使用完整的POSIX子系统),或者作为Win32本机可执行文件(如果要仅在命令行上运行sed)。

Windows版Sed(GnuWin32项目)

如果它必须是Windows的本机,那么我唯一可以建议的就是使用Windows所支持的脚本语言而无需附加组件,例如VBScript。


1

Cygwin有效,但是 也可以使用这些实用程序。只需将它们放到驱动器上,将目录放入路径中,就可以使用许多友好的Unix实用程序。轻巧的恕我直言,Cygwin(尽管效果也不错)。


0

我需要一个适用于Windows cmd.exe提示符的sed工具。Eric Pement的sed端口到单个DOS .exe对我来说非常有效。

有充分的记录


1
问题是关于Windows(cmd.exe)而不是DOS
a_horse_with_no_name 2015年

@royhowie:我明白了。尽管其中一些答案可能对某人有用,但我同意这个问题本身并不真正适合。OTOH,我不具备推荐批量删除的资格。
下午15年

在这种情况下,我认为要包含答案的基本部分将很困难,因为基本部分是链接页面上托管的.exe文件。我完全理解对链接腐烂的担心,只是不确定如何使它自成体系。
布莱恩·肯尼迪

感谢您的帮助,a_horse_with_no_name。我的语言很草率。我编辑了我的评论以解决您指出的问题。
布莱恩·肯尼迪
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.