带Xargs的sed无法打开传递的文件(Cygwin)

时间:2014-03-12 15:14:48

标签: windows sed grep cygwin xargs

尝试使用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.

1 个答案:

答案 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更小。