在Windows 7中使用find和sed以递归方式修改文件

时间:2011-07-20 15:12:29

标签: windows-7 powershell replace sed find

我正在尝试使用带有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

6 个答案:

答案 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,我在这个例子中已经完成了。

我希望这会有所帮助。