gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:40:21 25 4
gpt4 key购买 nike

我编写了一个非常简单的 bash 脚本来帮助我从开发迁移到暂存。它所做的是删除暂存中的所有文件,将文件从开发复制到暂存。

但是config.inc.php文件需要将第一个“dev”实例改为“stage”,其他实例不做任何改动。

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

谢谢。

最佳答案

这只会将第一次出现的“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命令仍然可以更改 develstagel例如,如果该行包含“将开发代码从/some/dev/location 移动到/some/stage/location”。
  • 另外,第二个 sed命令将映射每个 dev在包含 dev 的第一行之间找到第二条这样的线。如果有多个匹配行,这一点很重要,而原始的 ' 0,/dev/ '(或修改后的'0,/\<dev\>/')仅匹配要求的第一行。
  • 原因"s/\<dev\>/stage/"不工作不是 sed问题,但外壳问题。使用单引号,你几乎没问题。使用双引号时,反斜杠小于序列显示为 sed就像小于。
  • 经验法则:在包含正则表达式 Material 的 shell 脚本中,对任何参数使用单引号。除非它被单引号饱和,否则将正则表达式中的每个单引号替换为序列引号、反斜杠、引号、引号“'\''”。 (第一个引号终止单引号字符串;反斜杠引号是单引号;最后一个引号重新开始单引号字符串。)
  • 请注意 ' -i ' 选项是 sed 的 GNU 扩展;这是答案的合法部分,因为问题被标记为 Linux,其中 GNU sed用来;如果您需要迁移到 Solaris、AIX、HP-UX 等平台,请注意。
  • 最后,sed不支持标准的扩展正则表达式;你必须在 GNU sed 中使用 ' -r 显式启用它们' 选项。

据我估计,假设覆盖是可取的,命令应该是:

sed -i -r '0,/\<dev\>/s/\<dev\>/stage/' config.inc.php

关于linux - 编写 bash 脚本来更改文本并写入日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/346692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com