使用sed替换另一行(可能会改变)

时间:2013-05-15 14:50:51

标签: replace sed grep

我想运行一个脚本来更改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。我想这可能是因为字符串中有一些特殊字符,如<!>,但如果我想在上面添加日期字符串,我会有更多,例如:/。感谢您提供有关如何解决此问题的任何想法。

3 个答案:

答案 0 :(得分:1)

您不需要&lt;! - date - &gt;黑客攻击。您可以在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

答案 1 :(得分:1)

这将仅在包含<d>

的行上更改文字
sed -i.bak "/<d>/s/on .* at [^<]*/on newdate at newtime/" file.html

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

答案 2 :(得分:0)

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