Debian sed:无法读取

Debian sed:无法读取

我正在尝试运行一个命令来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相同。-pathfind

即使您更改为,您的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因此不需要使用扩展的正则表达式。

有关的:

相关内容