尝试使用Sed的美丽,所以我不必手动更新几百个文件。我注意到我的雇主只允许使用Win8(欢乐),所以我整天都在使用Cygwin,直到我可以在家里使用我的Linux机箱。
以下适用于Linux(bash)命令行,但不适用于Cygwin
> grep -lrZ "/somefile.js" . | xargs -0 -l sed -i -e 's|/somefile.js|/newLib.js|g'
sed: can't read ./testTarget.jsp: No such file or directory
# works
> sed -i 's|/somefile.js|/newLib.js|g' ./testTarget.jsp
因此命令本身可以工作,但不能通过Xargs传递。并且,在您说使用Perl而不是Sed之前,Perl等效项会抛出相同的错误
> grep -lrZ "/somefile.js" . | xargs -0 perl -i -pe 's|/somefile.js|/newLib.js|g'
Can't open ./testTarget.jsp
: No such file or directory.
答案 0 :(得分:0)
使用xargs -n
选项拆分参数并强制单独调用sed。
在使用GnuWin工具(不是Cygwin)的Windows上,我发现我需要将输入拆分为sed。默认情况下,xargs会将所有文件从grep传递到一次调用sed。
假设您有4个与您的grep调用匹配的文件,sed命令将通过xargs运行,如下所示:
sed -i -e 's|/somefile.js|/newLib.js|g' ./file1 ./file2 ./subdir/file3 ./subdir/file4
如果文件数太大,sed会给你这个错误。 使用-n选项让xargs重复调用sed,直到它耗尽所有参数。
grep -lrZ "/somefile.js" . | xargs -0 -l -n 2 sed -i -e 's|/somefile.js|/newLib.js|g'
在我的小例子中,使用-n 2将在内部执行此操作:
sed -i -e 's|/somefile.js|/newLib.js|g' ./file1 ./file2
sed -i -e 's|/somefile.js|/newLib.js|g' ./subdir/file3 ./subdir/file4
我有一大堆文件和目录(大约3000个文件),使用xargs -n 5工作得很好。 当我尝试-n 10时,我遇到了错误。使用xargs --verbose我可以看到一些命令行调用被切断了大约500个字符。因此,根据您正在使用的文件的路径长度,您可能需要使-n更小。