编写bash脚本来更改文本并写入日志

时间:2008-12-06 20:04:07

标签: linux bash

我编写了一个非常简单的bash脚本来帮助我从dev迁移到staging。它的作用是删除分段中的所有文件,将文件从dev复制到阶段。

但是,config.inc.php文件需要将“dev”的第一个实例更改为“stage”,并且不会更改其他实例。

其次,每次我运行它(我从dev目录运行脚本),我希望它在dev目录中写回一个日志,它会将我运行staging bash脚本的日期/时间戳附加到这个日志。

感谢。

3 个答案:

答案 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只是小于。
  • 经验法则:在包含正则表达式材质的shell脚本中的任何参数周围使用单引号。除非它被单引号括起来,否则使用序列引号,反斜杠,引号,引用“'\''”替换正则表达式中的每个单引号。 (第一个引号终止单引号字符串;反斜杠引号是单引号;最后一个引号重新启动单引号字符串。)
  • 请注意,“-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)而不进行备份。

相关问题