Unix SED - 获取标题然后将其设置到另一个位置
Unix SED - get title then set it another place
我有一个这样的 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//' page.html
但是没用。
不要使用正则表达式来解析 HTML。使用合适的解析器 & xpath :
# 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
是 xmlstarlet
检查:RegEx match open tags except XHTML self-contained tags
使用awk
:
awk '/<title>/ { title = [=10=]; sub(".*<title>", "", title); sub("</title>.*", "", title)}
/PAGE_TITLE/ { sub("PAGE_TITLE", title); }
1' filename > filename.new
您的 sed
脚本的问题是您使用的 *?
是不受支持的正则表达式扩展。使用 [^<>]*
而不是 .*?
.
可以获得大致相同的结果
此外,<title>
元素不允许出现在 HTML <body>
中,因此您不应包含它;您正在创建无效 HTML.
我有一个这样的 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//' page.html
但是没用。
不要使用正则表达式来解析 HTML。使用合适的解析器 & xpath :
# 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
是 xmlstarlet
检查:RegEx match open tags except XHTML self-contained tags
使用awk
:
awk '/<title>/ { title = [=10=]; sub(".*<title>", "", title); sub("</title>.*", "", title)}
/PAGE_TITLE/ { sub("PAGE_TITLE", title); }
1' filename > filename.new
您的 sed
脚本的问题是您使用的 *?
是不受支持的正则表达式扩展。使用 [^<>]*
而不是 .*?
.
此外,<title>
元素不允许出现在 HTML <body>
中,因此您不应包含它;您正在创建无效 HTML.