在jpg文件中使用grep查找和替换

时间:2012-02-29 03:48:02

标签: shell ssh grep replace

我一直在努力解决grep问题,试图在我的服务器上反转服务器范围内的黑客攻击,但grep似乎无法在作为shell运行时搜索jpg文件,但是grep命令它在ssh中的自己的工作文件。

会返回结果:     grep -l -R“nastycode”/ var / www / vhosts

但是当作为shell脚本运行时,它再也找不到jpgs了。

for file in $(grep -l -R "nastycode" /var/www/vhosts)
 do
  sed -e "s/"nastycode"/"nicecode"/ig" $file > /tmp/tempfile.tmp
  mv /tmp/tempfile.tmp $file
  echo "Modified: " $file
 done
问:这可能与'for file in'部分有关吗? 问:在我们的搜索模式“nastycode”中,我们可以搜索具有正则表达式字符的内容但是将它们视为正常($,|?etc)吗?

提前感谢。

尼古拉斯

1 个答案:

答案 0 :(得分:0)

只要没有换行符,

grep就可以选择忽略特殊字符(-F)。遗憾的是,sed没有这样的选择。如果其中包含特殊字符,则必须对其进行转义。如果其中包含大量/,则可以通过更改分隔符 - s|old|new|s@old@new@或您的代码不包含的其他字符来避免转义它们。关于结构的其余部分,我有几点意见。首先,你永远不应该使用那个for file in command结构,它会破坏白色空间;使用**(您可能需要首先使用shopt -s globstar启用它)或find。接下来,GNU sed有一个内联选项-i。您也可以为其指定备份后缀(例如-i.bak)。由于sed仅在找到模式时才会更改,因此无论如何都没有理由使用grep来限制文件。

将所有这些放在一起,(一旦你的正则表达式被转义 - 如果你需要它我们也可以提供帮助)你可以使用这些:

# Globstar
for file in /var/www/vhosts/**; do
    sed -i.bak 's/) || stristr(\$ua/) \&\&false || stristr($ua/ig' $file
done

# find
find /var/www/vhosts -type f -exec sed -i.bak 's/) || stristr(\$ua/) \&\&false || stristr($ua/ig' {} \;

# If you really want the echo notification
find /var/www/vhosts -type f -exec grep -qiF ') || stristr($ua' {} \; -exec sed -i.bak 's/) || stristr(\$ua/) \&\&false || stristr($ua/ig' {} + -printf "Modified %p\n"