Shell 如何在bash、sed或rpl脚本中传递用于搜索和替换的长字符串?

Shell 如何在bash、sed或rpl脚本中传递用于搜索和替换的长字符串?,shell,sed,replace,Shell,Sed,Replace,我正在创建一个脚本,它将字符串作为参数,并在目录中递归替换。下面的查找和替换脚本很好地处理了简单的大小写(单个单词): grep-rl$1.|xargs sed-i.backup-e“s/$1/$2/g” 但这里的事情变得有点棘手。我试图处理的字符串是一个恶意软件脚本,它感染了我编写的一个网站(但不托管): 这个字符串显然很复杂,因为bash和sed都需要一些转义。我尝试过rpl,一种特殊用途的替换工具,但它不能很好地处理空白: rpl-pR$*''* 但是,在提示符下,我可以用字符串替换$*

我正在创建一个脚本,它将字符串作为参数,并在目录中递归替换。下面的查找和替换脚本很好地处理了简单的大小写(单个单词):

grep-rl$1.|xargs sed-i.backup-e“s/$1/$2/g”

但这里的事情变得有点棘手。我试图处理的字符串是一个恶意软件脚本,它感染了我编写的一个网站(但不托管):

这个字符串显然很复杂,因为bash和sed都需要一些转义。我尝试过rpl,一种特殊用途的替换工具,但它不能很好地处理空白:

rpl-pR$*''*


但是,在提示符下,我可以用字符串替换$*并获得预期的行为。关于如何将bash、sed或rpl组合成一个可爱的remove long string.sh,你有什么想法吗?

我不知道
rpl
,但是如果你引用第一个参数,会有帮助吗?将整个字符串、空格和所有字符作为一个参数传递。如果没有引号,shell将把它拆分为多个参数

rpl -pR "$@" '' *


这是因为bash使用$*

请尝试以下操作:

rpl -pR "$@" '' *

不,该字符串实际上不需要任何转义:)

对于sed,您需要首先转义反斜杠,然后转义sed边框字符(在上面的示例中为#)和所有regexp控件--^$[].+?等等

var="${var//\\/\\\\}"
var="${var//#/\\#}"
var="${var//[/\\[}"
# ...
# I'm sure this can somehow be converted into tr script
grep -rl $1 . | xargs sed -i .backup "s#$var#here be dragons#g" 

否,使用“$*”shell将连接参数:参数列表“一”“二”“三”“四”变为“一”“二”“三”“四”。如果使用“$@”,则不会发生这种情况,参数列表不会更改。有关详细信息,请参见bash手册页。谢谢,这就成功了。现在我可以从命令行替换到我的核心内容。有趣的解决方案,但我认为var技巧无助于将长字符串作为命令行参数传递。我认为除了最大参数长度限制(我认为linux上为128Kb)之外,没有其他限制
var='<iframe src="http://reycross.cn/qaqa/" width=0 height=0 style="hidden" frameborder=0 marginheight=0 marginwidth=0 scrolling=no></iframe>'
echo "$var" | grep -v "$var" # prints nothing
echo "$var" | sed "s#$var#complete match#" # prints "complete match"
var="$(cat file_with_search_string)"
var="${var//\\/\\\\}"
var="${var//#/\\#}"
var="${var//[/\\[}"
# ...
# I'm sure this can somehow be converted into tr script
grep -rl $1 . | xargs sed -i .backup "s#$var#here be dragons#g"