【问题标题】:Linux find with sed not work [closed]Linux 用 sed 查找不起作用 [关闭]
【发布时间】:2016-01-12 16:10:30
【问题描述】:

我有一个大问题。我正在尝试从项目中的第一行 php 文件中删除恶意软件代码,但控制台总是返回:

sed: 1: "./{PATH_TO_FILE}": 无效的命令代码。

我的要求:

find . -name "*.php" -type f -exec sed -n -i '1s/.*/<?php/' {} \;

谁能告诉我这里出了什么问题? :)

提前非常感谢!

【问题讨论】:

  • 有多少个文件?
  • 找到 . -name ".php" -type f -exec sed -n -i '1s/.*/
  • 不要尝试编辑受感染的文件。用干净的备份替换它们
  • @Mithrandir:不要将 -n-i 结合使用:它会截断输入文件,因为 -n 会抑制所有(隐式)输出,以便 没有写回输入文件。
  • 我认为@mklement 在上面的回答正确,-n 排除了输出(没有p sed 命令,但更容易删除-n)。

标签: linux bash sed find


【解决方案1】:

首先,您没有将通配符放在“.php”中。它应该是“*.php”。

find . -name "*.php"

其次,你忘了在exec子句中添加文件名的占位符和exec子句的结尾(分号):

第三,你的 sed 表达式无效。如果您想要实现的是删除第一行,那么 '1d' 应该可以:

-exec sed -n -i '1d' {} \;

最后,-n 似乎干扰了-i,所以把它去掉。

您的完整命令应该是:

find . -name "*.php" -type f -exec sed -i '1d' {} \;

【讨论】:

  • 优点(结合-n-i 实际上截断输入文件,因为-n 抑制所有(隐式)输出,因此什么都没有 i> 被写回输入文件)。但是,其意图是将第一行替换&lt;?php,而不是删除它,所以它应该是sed -i '1s/.*/&lt;?php/'
【解决方案2】:

非常感谢!最后我使用命令解决了问题

LC_ALL=C find . -name "*.php" -type f -exec sed -i '' -e "s/^<\?php.*\?>//" {} \;

【讨论】:

    猜你喜欢
    • 2016-09-21
    • 2015-02-28
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 2017-07-07
    • 2019-11-20
    相关资源
    最近更新 更多