我编写了一个非常简单的bash脚本来帮助我从dev迁移到staging。它的作用是删除分段中的所有文件,将文件从dev复制到阶段。
但是,config.inc.php文件需要将“dev”的第一个实例更改为“stage”,并且不会更改其他实例。
其次,每次我运行它(我从dev目录运行脚本),我希望它在dev目录中写回一个日志,它会将我运行staging bash脚本的日期/时间戳附加到这个日志。
感谢。
答案 0 :(得分:4)
这只会将“dev”的第一次出现改为“stage”
sed -i '0,/dev/ s/dev/stage/' config.inc.php
请注意,它会将“devel”更改为“stageel”。这个版本的行为就像你想要的那样,只搜索“dev”,而不是“devel”(事实上,s/\<dev\>/stage/
因为替换表达式应该可以工作,但它似乎没有按预期工作?我会如果有更多sed-fu的人可以解释,那就很高兴。)
sed -i "/\<dev\>/,/\<dev\>/ s/dev/stage/" config.inc.php
用于记录:
date >> /path/to/dev/run.log
由Jonathan Leffler添加
sed
命令仍然可以将devel
更改为stagel
从/ some / dev / location到/ some / stage / location “。sed
命令将映射在包含dev
的第一行和第二行之间找到的每个dev
。如果有多个匹配行,则这很重要,而原始的“0,/dev/
”(或修改后的“0,/\<dev\>/
”)仅匹配请求的第一行。"s/\<dev\>/stage/"
不起作用的原因不是sed
问题,而是shell问题。使用单引号,你几乎可以。使用双引号时,反斜杠小于序列似乎sed
只是小于。'\''
”替换正则表达式中的每个单引号。 (第一个引号终止单引号字符串;反斜杠引号是单引号;最后一个引号重新启动单引号字符串。)-i
”选项是sed
的GNU扩展名;这是答案的一个有效部分,因为问题标记为Linux,其中使用了GNU sed
;请注意是否需要迁移到Solaris,AIX,HP-UX等平台。sed
不支持扩展正则表达式作为标准;你必须使用'-r
'选项在GNU sed中明确启用它们。根据我的估计,假设需要覆盖,命令应为:
sed -i -r '0,/\<dev\>/s/\<dev\>/stage/' config.inc.php
答案 1 :(得分:1)
更改文件中的字词:
cat config.inc.php | sed 's:dev::stage' > config.inc.php.new
要附加到日志文件:
echo $timestamp >> mylogfile.log
答案 2 :(得分:0)
使用流编辑器实用程序sed
可以很好地完成第一部分(编辑文件):
sed -i -e s/dev/stage/ config.inc.php
使用表达式-i
(/dev/stage/
)将一个表达式替换为另一个表达式,就地编辑文件(-e
)而不进行备份。