【问题标题】:Replace dynamic generated string using sed使用 sed 替换动态生成的字符串
【发布时间】:2015-09-17 14:05:34
【问题描述】:

我想使用 sed 重命名一个文件。为简单起见,这就是我想要做的:

sh-4.3$ echo `date`
Thu 17 Sep 08:29:50 EAT 2015
sh-4.3$ echo `date` | sed 's/`date`/Today/'
Thu 17 Sep 08:29:58 EAT 2015
sh-4.3$ 

我希望它回应“今天”。有什么收获?

【问题讨论】:

标签: bash date sed


【解决方案1】:

在单引号内,不计算反引号。改用双引号:

$ echo `date` | sed "s/`date`/Today/"
Today

由于各种原因,反引号被认为是过时的。对于所有 POSIX shell,请使用 $(...):

$ echo $(date) | sed "s/$(date)/Today/"
Today

虽然它可能与您的较大脚本无关,但对于这个简单的命令,不需要echo

$ date | sed "s/$(date)/Today/"
Today

请注意,这是脆弱的。如果在执行一个和另一个 date 命令之间的秒数发生了变化,那么这个替换将会失败。

【讨论】:

  • 感谢您的指点。我最终不会使用秒数,因为我只对 D、M 和 Y 部分感兴趣,如下所示:echo $(date +%Y%m%d) | sed "s/$(date +%Y%m%d)/Today/"。工作正常,也感谢 $(...) 指针
  • @Benda 很高兴它有帮助。
【解决方案2】:
echo `date`

不一样

echo 'date'

反引号导致执行包含在其中的表达式,单引号是纯字符串。

由于您的回显如此简单,echo date 也可以正常工作。

【讨论】:

    【解决方案3】:

    我也预想更改分隔符,日期信息可能有一些元字符,具体取决于设置

    date | sed "s~$( date )~Today~"
    

    【讨论】:

      猜你喜欢
      • 2021-03-01
      • 1970-01-01
      • 2019-01-04
      • 2020-07-28
      • 2017-02-08
      • 2015-05-10
      • 2020-03-13
      • 2015-01-13
      • 2012-12-21
      相关资源
      最近更新 更多