使用 sed 替换具有许多特殊字符的行?

使用 sed 替换具有许多特殊字符的行?

我正在为一个项目编写一个相当庞大的脚本,在完成它之前遇到的问题之一是使用 sed 命令。

我试图找到一行(位于cache.php):

$cache_directory = './cache'; 

并将信息替换'./cache'为名为 的变量$new_cache_directory

我遇到的问题之一是./cache多次存在。我只想替换这一行,但我也不想对行号进行“硬编码”以“面向未来”。

我怎样才能做到这一点?

答案1

尝试这个:

sed -i.bak "s:^.*\(\$cache_directory = \)\('./cache'\):\1$new_cache_directory:" infile

答案2

所以我猜你想用所述变量的内容替换“缓存”,而不是用它的名称:

sed 's#^$cache_directory = ../cache.;#$cache_directory = '$new_cache_directory'#' script.php

所以你有不同的问题需要解决:通常 sed 命令使用斜杠来分隔各个部分:'s/foo/bar/'。在处理路径时,这很令人不安,但我们可以使用许多分隔符 - 它们只是在“s”后面隐式声明。

问题2类似。我们经常用单引号指定命令:

sed 'command' file 

但这里我们在 ./cache 周围有撇号 - 该怎么办?一种想法是,使用

sed "command" file 

相反,这通常有效,但在这里不起作用。撇号可以防止美元符号被解释,但引号不会阻止这种情况。通常,您甚至不需要撇号,并且可以编写:

sed s/standart/standard/g sample.txt 

但同样,您将 $cache_directory 作为命令中的变量,它将被解释。所以我只是用小丑符号点替换撇号,如果其他表达式与该部分匹配,我会感到非常惊讶:../cache.就像xy/cachei- 不太可能,是吗?

但是您希望将 $new_cache_directory 替换为变量的内容,因此我使用 关闭屏蔽= ',插入变量,然后再次打开屏蔽以使用“#”完成命令。

相关内容