Grep反转匹配的字符串,而不是行匹配

时间:2015-06-03 03:07:04

标签: regex string bash sed grep

我会解释为什么我需要帮助才能达到最低限度。我的一个文件目录被XSS攻击,并在所有php文件的开头放置了一个长字符串。我曾尝试使用sed替换字符串,但它不起作用,因为要匹配的模式包含许多需要转义的字符。

我发现我可以使用fgrep来匹配模式文件中保存的固定字符串,但我想在每个字符串中替换匹配的字符串( NOT THE LINE )文件,但是grep的{​​{1}}反转了该行的结果,而不是匹配字符串的结尾。

这是我在包含被黑客攻击的示例文件上使用的命令

-v

我需要输出包含位于行尾的fgrep -v -f ~/hacked-string.txt example.php (有时它是<?php标记),但<style>选项在该行的末尾反转,所以输出开头不包含-v

注意

我尝试使用<?php-o而不输出任何内容:

--only-matching

grep中是否有另一个选项可用于在匹配模式的末尾反转,而不是模式匹配的行?或者,是否有更容易的选项来替换所有fgrep -f ~/hacked-string.txt example.php --only-matching -v 个文件中被黑客攻击的字符串?

以下是.php中的内容的小片段(为了便于阅读而添加了换行符):

hacked-string.txt

提前致谢!

3 个答案:

答案 0 :(得分:2)

我认为你问的是:

&#34;是否可以使用grep实用程序从文件中删除固定字符串的所有实例(可能包含许多正则表达式元字符)?&#34;

在这种情况下,答案是&#34;否&#34;。

我想你想问的是:

&#34;从文件中删除固定字符串的所有实例(可能包含大量正则表达式元字符)的最简单方法是什么?&#34;

这是一个相当简单的解决方案:

delete_string() {
  awk -v s="$the_string" '{while(i=index($0,s))$0=substr($0,1,i-1)substr($0,i+length(s))}1'
}

delete_string 'some_hideous_string_with*!"_inside' < original_file > new_file

shell语法略显脆弱;如果字符串包含撇号(&#39; ),它将会中断。但是,您可以使用以下命令将stdin中的原始字符串读取到变量中:

$ IFS= read -r the_string
absolutely anything here

可以使用任何不包含换行符或NUL字符的字符串。在变量中包含字符串后,可以使用上面的函数:

delete_string "$the_string" < original_file > new_file

这是另一个可能的一个班轮,使用python:

delete_string() {
  python -c 'import sys;[sys.stdout.write(l.replace(r"""'"$1"'""","")) for l in sys.stdin]'
}

这不会处理具有三个连续引号(""")的字符串。

答案 1 :(得分:0)

每个文件中被黑网的字符串是否相同?

如果字符中被黑网字符串的长度为1234,那么您可以使用

tail -c +1235 file.php > fixed-file.php

每个受感染的文件。

请注意tail c +1235告诉输入文件的第1235个字符输出。

答案 2 :(得分:0)

使用perl:

perl -i.hacked -pe "s/\Q$(<hacked-string.txt)\E//g" example.php

注意:

  • $(<file)位是用于读取文件内容的bash快捷方式。
  • \Q\E位来自perl,它们将两者之间的内容视为普通字符,忽略正则表达式元字符。
  • -i.hacked选项将就地编辑文件,创建备份“example.php.hacked”