我正在尝试使用带有GNU sed的Windows 7中的find来递归替换多个目录中的多个文件中的一行文本。我查看了this question,但PowerShell解决方案似乎只能使用一个文件,我希望从当前目录递归地处理具有特定扩展名的所有文件。我试过这个命令:
find "*.mako" -exec sed -i "s:<%inherit file="layout.mako"/>:<%inherit file="../layout.mako"/>:"
但这给了我一堆垃圾并且不会改变任何文件:
---------- EDIT.MAKO
File not found - -EXEC
File not found - SED
File not found - -I
File not found - LAYOUT.MAKO/>:<%INHERIT FILE=../LAYOUT.MAKO/>:
我该怎么做?看起来我应该安装所需的所有工具,而无需安装Cygwin或UnixUtils或其他任何工具。
编辑:好吧,使用GNU查找,我仍然无法到达任何地方,因为我无法让查找部分工作:
> gfind -iname "*.mako" .
C:\Program Files (x86)\GnuWin32\bin\gfind.exe: paths must precede expression
> gfind . -iname "*.mako"
C:\Program Files (x86)\GnuWin32\bin\gfind.exe: paths must precede expression
> gfind -iname "*.mako" .
C:\Program Files (x86)\GnuWin32\bin\gfind.exe: paths must precede expression
由于this question,我最初没有在Windows 7中使用GNU find。
修改
我尝试了以下操作,但是sed没有看到任何输入文件:
> ls -r | grep mako | sed -i 's/file="layout.mako"/file="..\/layout.mako"/'
sed.exe: no input files
答案 0 :(得分:3)
正在寻找来自Windows的FIND,而不是从gnu中找到。
因此,将find.exe(从gnu)重命名为gfind.exe(例如),然后在您希望运行它时调用gfind而不是find。
[编辑]
gfind . -name "*.mako"
(不是gfind -iname "*.make" .
)
[/编辑]
答案 1 :(得分:1)
您正在执行常规Windows'find'命令,该命令与gnu find具有完全不同的命令行参数。 MS find无法为每场比赛执行一个程序,它只是搜索。
答案 2 :(得分:1)
添加给Marc B / KevinDTimm答案:你的查找语法错误。
不是:
find "*.mako"
但:
find -name "*.mako"
此外,如果有匹配"*.mako"
的目录,它们将被发送到sed。为了避免这种情况:
find -name "*.mako" -type f
最后,我认为你最后错过了'\;'
或者你的find命令。
答案 3 :(得分:1)
在Powershell中,请注意使用反引号的转义序列
find . -type f -exec grep hello `{`} `;
使用xargs
更容易find . | xargs grep hello
答案 4 :(得分:0)
我尝试了以下操作,但是sed没有看到任何输入文件:
ls -r | grep mako | sed -i's / 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"/' $_}
答案 5 :(得分:0)
按你的
编辑:
我尝试了以下操作,但是sed没有看到任何输入文件:
ls -r | grep mako | sed -i 's / file =“layout.mako”/ file =“../ layout.mako”/'sed.exe:没有输入文件
您需要使用 xargs 来汇总传递给sed的文件列表,即
ls -r | grep mako | xargs sed -i 的\:文件= “layout.mako”:文件= “../ layout.mako”:“
请注意,对于大多数sed版本,您可以使用替代字符来标识替换匹配/替换字符串(通常为“/”)。有些seds需要转义替换char,我在这个例子中已经完成了。
我希望这会有所帮助。