Unix SED - 获取标题然后将其设置为另一个地方

时间:2015-01-22 16:57:17

标签: linux bash shell unix sed

我有一个像这样的HTML文件:

<html><head>
<title>My Title</title>
</head>
<body>
Title of this page: PAGE_TITLE
</body>
</html>

如何在标题上替换PAGE_TITLE?

我尝试这个命令:

sed -i 's/\(.*?<title>\)\(.*?\)\(<\/title>.*?\)PAGE_TITLE/\1\2\3\2/' page.html

但它没有用。

3 个答案:

答案 0 :(得分:3)

不要使用正则表达式来解析HTML。使用适当的解析器&amp;

# fetch title string
title=$(xml sel -t -v /html/head/title file.html)
# edit file in-place
xml ed -L -u '/html/body/text()' -v "Title of this page: $title" file.html

xml

检查:RegEx match open tags except XHTML self-contained tags

答案 1 :(得分:1)

使用awk

awk '/<title>/ { title = $0; sub(".*<title>", "", title); sub("</title>.*", "", title)}
     /PAGE_TITLE/ { sub("PAGE_TITLE", title); }
     1' filename > filename.new

答案 2 :(得分:0)

您的sed脚本存在的问题是您使用的是*?,这是一个不受支持的正则表达式扩展程序。您可以使用[^<>]*代替.*?获得相同的结果。

此外,HTML <title>中不允许使用<body>元素,因此您不应该包含它;您正在创建无效的HTML。