我正在尝试运行一个命令来require_once
从 php 文件中删除这里(下面的代码),但我收到错误:
sed:无法读取-:没有这样的文件或目录
我在正确的文件夹中;有什么问题?
find . -name '*.php' -not -wholename '*/Loader/Autoloader.php' \
-not -wholename '*/Application.php' -print0 | \
xargs -0 sed --regexp-extended --in-place 's/(require_once)/\/\/ \1/g'
更新:
如果我运行:
find . -name '*.php' -not -wholename '*/Loader/Autoloader.php' \
-not -wholename '*/Application.php' -print0
我得到:
查找:无效谓词“-wholename”
我尝试了这个并且它返回了所有文件的列表:
find . -name '*.php' -not -name '*/Loader/Autoloader.php' \
-not -name '*/Application.php' -print0
但随后更改原始内容以反映这一点:
find . -name '*.php' -not -name '*/Loader/Autoloader.php' \
-not -name '*/Application.php' -print0 | \ xargs -0 sed --regexp-extended --in-place 's/(require_once)/\/\/ \1/g'
给出错误:
-bash:xargs:找不到命令
仅供参考,我正在运行 sed 版本 4.1.2,我已经在命令行中有点迷失了,所以请解释答案
答案1
该错误似乎表明 sed 尝试读取标准输入。你有没有尝试过寻找部分查看它是否返回任何文件?
答案2
你的第二次调用没有任何意义,为什么 xarsg 之前有“\”?你尝试调用一个名为“xargs”的程序,bash 告诉你它找不到它(注意冒号后面的双空格),这并不奇怪。
要消除当 xargs 返回零文件时 sed 挂起的错误情况(因为它在没有命令行参数时尝试从 stdin 读取),您应该将 -r 添加到 xargs 参数中。
答案3
sed
你有什么版本的? POSIX sed 不理解双破折号选项,minished 也不理解,但 GNU sed 可以。
对于更便携(并且在我看来更好)的东西,请尝试sed -i '/require_once/s![[:space:]]*!&// !'
.
答案4
不幸的是,问题链接到的页面已经消失,所以我无法检查原始命令。相反,我会做一些猜测。
第一个错误来自运行 GNUsed
并对名为 .txt 的输入文件进行就地编辑-
。该文件不存在,您会收到该错误:
示例(使用空sed
脚本):
$ sed -i -e '' -
sed: can't read -: No such file or directory
我不知道文件名来自哪里-
,但它可能与未从中获取任何文件名有关find
(见下文)。
然后,您似乎已切换到其他机器或find
实现,因为现在find
命令不再识别-wholename
测试。这个错误让我很困惑。
然后您更改-wholename
为-name
,但您应该将其更改为-path
与GNU 中的-wholename
相同。-path
find
即使您更改为,您的find
命令仍然不起作用,因为您使用的表达式应该是正则表达式。-wholename
-path
作为正则表达式,*/Application.php
匹配确切的字符串*/Application.php
。*
正则表达式开头的A与文字 匹配*
。您可能打算使用.*/Application.php
,但这与 相同-name "Application.php"
。
考虑到上述所有因素,并删除xargs
调用 (那错误来自于转义命令名称前面的空格,该空格随后成为实际命令名称的一部分,无法找到):
find . -type f -name '*.php' \
! -path '.*/Loader/Autoloader.php' \
! -name 'Application.php' \
-exec sed -i 's/require_once/\/\/ &/' {} +
这也稍微减少了对 GNU 的调用,sed
因此不需要使用扩展的正则表达式。
有关的: