ChatGPT解决这个技术问题 Extra ChatGPT

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

关闭。此问题不符合 Stack Overflow 准则。它目前不接受答案。我们不允许提出有关书籍、工具、软件库等建议的问题。您可以编辑问题,以便可以用事实和引用来回答它。 7年前关闭。改进这个问题

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

“本地人”是什么意思???可安装以在 cmd.exe 中工作,还是无需安装即可工作?如果是前者,请参阅下面引用的 GnuWin32;如果是后者,没有。没有为 Windows 预装本机 sed。
本地我的意思是在所有窗口上运行而无需安装其他东西的解决方案。
留下 cmd.exe 并改用 PowerShell。
如果您只想从文件中删除某些行,请使用 FIND /?

C
Clément Moulin - SimpleRezo

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


另外:如果你想从普通 cmd 调用它,只需 @powershell -Command "get-content..." 它。唯一需要注意的是,您必须转义引号: ... -Command "get-content ... \"expression\",..."
@Tarc AFAIR,您可以在命令中使用单引号并使用双引号来引用命令
我今天在一个文件上尝试了这个以删除某些地方的引号之间的一些东西,却发现输出的文件几乎是原始文件的两倍。原因似乎是这种方法改变了文件中换行符的处理方式,使用“\r\n”而不是“\n”。
@and-bri (Get-Content c:\temp\test.txt).replace('[MYID]', 'MyValue') |设置内容 c:\temp\test.txt
@JakubŠturc 您为替换 sed 而提出的解决方案对我不起作用。我改用了它,它运行良好:(Get-Content myFile.txt) -replace 'foo', 'bar' | Out-File -encoding ASCII myFile.txt(这是用于将整个文件中的文本 'foo' 替换为文本 'bar'。这取自 stackoverflow.com/a/20999154/4441211
b
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 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 的依赖是最轻量级的解决方案。
GnuWin32 是本机解决方案,如果本机是指设计为在“正常”Windows 环境中运行(与 CygWin 不同)。试一试,你会开始期待它们出现在你使用的每个 Windows 系统上。 !!!
适用于我的情况!另外,不要忘记 "//NoLogo" cscript 选项。
如果这是“现成的”,想知道您的其他代码是什么样的!太棒了,谢谢。
JScript 可以使用类似的正则表达式搜索和替换实用程序。与 VBScript 相比,JScript 的优势在于它可以在单个脚本中轻松地与批处理相结合,从而使该实用程序更易于在批处理或命令行上下文中使用。 A robust hybrid JScript/batch utility called REPL.BAT is available。它有许多命令行选项。完整的文档嵌入在脚本中。它当然没有完整的 sed 功能,但即便如此,它还是相当强大的。
A
Adam Hughes

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


m
mkluwe

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

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


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

这是的行为

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

它完美地工作。注意:“get-content”上的括号确保以后调用“set-content”时文件不会被使用。
cmd中有类似的可能吗?了解这仅适用于 pwsh
'SourceRegexp' 是否可以被任何可能的正则表达式取代?这真的适用于电源外壳吗?
R
Rob Kam

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


J
James Boother

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


这些可能是 PowerShell 中对 sed 所做的贡献最小的两件事 ;-)。 -replace 运算符可能是一个更好的建议。
B
Brandon DuRette

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

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


C
Colin Nicholls

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

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


如果我真的不能使用 *nix 之类的 shell,我更喜欢这个,因为它是一个没有依赖关系的小型独立 exe。
r
robintw

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


B
Booji Boy

埃德林或编辑

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


两者都不再存在于 64 位版本的 Windows 上。
P
Paul Rooney

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

替代链接 - 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


repl 的 Dropbox 链接已关闭。你有二级链接吗?
L
Linor

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


J
Jay

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

Sed for Windows (GnuWin32 Project)

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


M
Mark

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


b
bryan kennedy

我需要一个适用于 Windows cmd.exe 提示符的 sed 工具。 Eric Pement's port of sed to a single DOS .exe 对我很有效。

很好documented


问题是关于 Windows (cmd.exe) 而不是 DOS
@royhowie:我明白了。尽管其中一些答案可能对某人有用,但我同意这个问题本身并不适合 SO。 OTOH,我觉得没有资格推荐批发删除。
在这种情况下,我认为很难包含答案的基本部分,因为基本部分是链接页面上托管的 .exe 文件。我完全理解对链接腐烂的担忧,我只是不确定如何使这个自包含到 SO。
感谢您的捕获,a_horse_with_no_name。我的语言很草率。我编辑了我的评论以解决您指出的问题。