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