Windows 7 在Windows7中使用find和sed递归修改文件

Windows 7 在Windows7中使用find和sed递归修改文件,windows-7,powershell,replace,sed,find,Windows 7,Powershell,Replace,Sed,Find,我正在尝试使用GNU sed在Windows7中查找来递归地替换多个文件中的一行文本,跨越多个目录。我查看了,但是PowerShell解决方案似乎只适用于一个文件,我希望使用当前目录中具有特定扩展名的所有文件。我试过这个命令: find "*.mako" -exec sed -i "s:<%inherit file="layout.mako"/>:<%inherit file="../layout.mako"/>:" 我最初没有在Windows7中使用GNU查找,因为

我正在尝试使用GNU sed在Windows7中查找来递归地替换多个文件中的一行文本,跨越多个目录。我查看了,但是PowerShell解决方案似乎只适用于一个文件,我希望使用当前目录中具有特定扩展名的所有文件。我试过这个命令:

find "*.mako" -exec sed -i "s:<%inherit file="layout.mako"/>:<%inherit file="../layout.mako"/>:"
我最初没有在Windows7中使用GNU查找,因为

编辑:

我尝试了以下操作,但sed没有以这种方式看到任何输入文件:

> ls -r | grep mako | sed -i 's/file="layout.mako"/file="..\/layout.mako"/'
sed.exe: no input files

正在从windows查找,而不是从gnu查找

因此,将find.exe(从gnu)重命名为gfind.exe(例如),然后在希望运行它时调用gfind而不是find

[编辑]
gfind-名称“*.mako”
(非
gfind-iname”*.make.


[/edit]

您正在执行常规的windows“find”命令,该命令的命令行参数与gnu find命令完全不同。MS find没有为每个匹配执行程序的功能,它只是搜索。

添加到Marc B/KevinDTimm回答:您的查找语法错误

它不是:

find "*.mako"
但是:

此外,如果有与
“*.mako”
匹配的目录,它们将被发送到sed。为了避免这种情况:

find -name "*.mako" -type f
最后,我认为您缺少了一个
“\;”在末尾或使用find命令

我尝试了以下操作,但sed没有以这种方式看到任何输入文件:

> ls -r | grep mako | sed -i 's/file="layout.mako"/file="..\/layout.mako"/'
sed.exe: no input files
ls-r | grep mako | sed-i的/file=“layout.mako”/file=“../layout.mako”/ sed.exe:没有输入文件

使用此选项,您现在将遇到PowerShell的“ls”别名。调用“ls.exe”或按如下方式运行所有PowerShell:

ls -r | select-string mako -list | select -exp path | sed -i 's/file="layout.mako"/file="..\/layout.mako"/'
编辑:

如果stdin处理似乎不起作用,解决方法

ls -r | select-string mako -list | select -exp path | % {sed -i 's/file="layout.mako"/file="..\/layout.mako"/' $_}
根据你的

编辑:

我尝试了以下操作,但sed没有以这种方式看到任何输入文件:

> ls -r | grep mako | sed -i 's/file="layout.mako"/file="..\/layout.mako"/'
sed.exe: no input files
ls-r | grep mako | sed-i 's/file=“layout.mako”/file=“../layout.mako”/sed.exe:无输入文件

您需要使用xargs组合传递给sed的文件列表,即

ls-r | grep mako |xargssed-i 's \:file=“layout.mako”:file=“../layout.mako”:

请注意,对于大多数版本的sed,可以使用替换字符来标识替换匹配/替换字符串(通常为“/”)。有些SED需要转义这个备用字符,我在本例中已经这样做了


我希望这会有所帮助。

在Powershell中,请注意使用反勾号的转义序列

find . -type f -exec grep hello  `{`} `;
使用xargs要容易得多

find . | xargs grep hello

在非*nix系统上,终止符应为
\作为
在windows操作系统的
PS>ls-r | select string mako-list | sele ct-exp path | sed-i's/file=“layout.mako”/file=“..\/layout.mako”/“sed.exe:没有输入文件
,而执行所有命令,但
sed
部分确实得到了正确的文件列表。我认为
sed
在这里做了一些不同寻常的事情。文件路径应该进入
sed
的stdin。
find . | xargs grep hello