【问题标题】:Using sed to replace one line (that might change) with another使用 sed 将一行(可能会更改)替换为另一行
【发布时间】:2013-05-10 05:12:13
【问题描述】:

我想运行一个脚本来更改 HTML 代码中的一行,以指示页面上次更新的时间。例如,我有一行

<d>This page was last updated on 29.04.2013 at 00:34 UTC</d>

我现在正在更新它,所以我想用

替换该行

<d>This page was last updated on 15.05.2013 at 15:50 UTC</d>

这是我的源代码中唯一带有<d> 标记的行,希望对您有所帮助。我已经有一些代码可以使用当前日期和时间生成新字符串,但我无法找到替换旧字符串的方法(它会改变,所以我不知道确切是什么它是)。

我尝试在上一行添加注释<!--date-->,删除包含<d> 的整行(带有grep),然后在作为新字符串的注释之后添加新行,但这失败了。例如,如果我只想在评论后插入字符串text,然后使用

sed -i 's/<!--date-->/<!--date-->text/' file.html

我收到invalid command code j。我想可能是因为字符串中有一些特殊字符,如<!>,但如果我想在上面输入日期字符串,我会有更多,比如:/。感谢您提供有关如何解决此问题的任何想法。

【问题讨论】:

  • 信不信由你,我认为问题在于您正在使用csh 或其他试图对单引号内的! 进行历史扩展的shell。尝试使用不同的外壳。

标签: replace sed grep


【解决方案1】:

这将仅更改包含<d> 的行上的文本:

sed -i.bak "/<d>/s/on .* at [^<]*/on newdate at newtime/" file.html

我已经使用 MacOS X 10.8.3 附带的 BSD sed 对此进行了测试

【讨论】:

  • 完美。也会创建一个.bak 文件,但这并不重要。
  • 我因为没有那个 bak 文件而被咬过几次,所以我想都没想就把它放了进去。当然,您可以删除它。
【解决方案2】:

你不需要你的 hack。您可以在 sed 命令中使用正则表达式和除“/”之外的其他分隔符:

sed -i.bak 's@<d>This page was last updated on.*</d>@<d>This page was last updated on 12.05.2013 at 00:38 UTC</d>@' whatever.html

或者,如果您将更新保存在名为 $replacement 的变量中:

sed -i.bak "s@<d>This page was last updated on.*</d>@$replacement@" whatever.html

【讨论】:

  • 不,在这两种情况下,使用bashsh,我都会得到同样的错误。我应该提到我正在运行 Mac OS 10.7.5
  • 嗯......在我的 Linux 机器上的 bash、csh 和 zsh 中工作......那么抱歉,我不知道!
  • 好的,请参阅this ...您需要在 -i ... -i.bak 或其他任何东西上添加“备份”扩展名。
  • 太好了,现在可以了!但是-i.bak之间不能有空格,否则会失败。
  • 这很有趣......我最初有它没有空格,但我看到this answer有一个空格。
【解决方案3】:

使用命令行时,尝试转义特殊字符,如下所示:
! ===> \!

【讨论】:

  • 没有骰子。同样的错误,仅用于!,或!&lt;,和&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2020-05-14
  • 2018-08-12
  • 1970-01-01
相关资源
最近更新 更多