我正在为一个项目编写一个相当庞大的脚本,在完成它之前遇到的问题之一是使用 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 替换为变量的内容,因此我使用 关闭屏蔽= '
,插入变量,然后再次打开屏蔽以使用“#”完成命令。