Bash:带有sed的html标签内的大写文本

Posted

技术标签:

【中文标题】Bash:带有sed的html标签内的大写文本【英文标题】:Bash: uppercase text inside html tag with sed 【发布时间】:2020-01-12 11:11:45 【问题描述】:
echo -e '<h1>abcd</h1>\n<h2>efgh</h2>' | sed 's#<h1>(.*?)<\h1>#<h1>\U&</h1>#g'

想要的输出是:

<h1>ABCD</h1>
<h2>efgh</h2>

有什么想法吗?谢谢。

【问题讨论】:

POSIX BRE 中的 () 是模式内的文字字符。使用-E 选项并将.*? 替换为[^&gt;]*,因为POSIX BRE/ERE 不支持惰性量词。 作业工具错误。必填历史链接:***.com/a/1732454/14122 .*?either BRE 或 POSIX ERE 中不支持语法。 \U 也不是——在使用它时,您依赖于非标准扩展(由您的操作系统的 sed 副本提供,因为该工具不是 bash 的一部分并且因平台而异)。 ...所以,如果你想正确,请使用真正的 html 解析器——Python 的 lxml.html 是一个很棒的解析器。 sed 失败的情况不仅仅是小而晦涩——将&lt;h1&gt; 放在一行,将文本放在第二行,将&lt;/h1&gt; 放在第三行,您的代码会忽略那里有一个标签。或者将h:xmlns="http://www.w3.org/1999/xhtml" 放在封闭范围内,它必须是&lt;h:h1&gt; 才能被识别,但sed 无法知道这一点。或者改成&lt;h1 class="whatever"&gt;,相当于一个HTML解析器,又不匹配了……等等等等。 一些反对票。关闭请求。我只想让它与这个非常简单的例子一起工作。仅此而已...直到现在,什么都没有。 【参考方案1】:

这仅适用于您的情况,不解析 HTML。

免责声明

初读:https://***.com/a/1732454/7939871

这种使用sed Search-and-replace 正则表达式的解析是一种快捷解释。

它绝不可用于任何类型的生产设置;因为它会破坏许多有效的 HTML 语法或布局变化,例如:命名空间、多行、间距、嵌套、属性的使用、实体、CDATA……

sed -E 's#<h1>(.*)</h1>#<h1>\U\1\E</h1>#g' <<<$'<h1>abcd</h1>\n<h2>efgh</h2>'

基本上,它打开大写\U,然后打印捕获的组1 \1,然后关闭大写\E

【讨论】:

有时我们需要的只是一个简单的解决方案,而不是一个完整的、通用的解决方案。谢谢你给了我这个。

以上是关于Bash:带有sed的html标签内的大写文本的主要内容,如果未能解决你的问题,请参考以下文章

通过 Bash 从文本文件中删除空行,包括空格字符 [重复]

span 标签内的垂直居中文本

使用bash匹配标签内的标签

HTML&CSS基础学习笔记1.6-html的文本操作标签

sed one-liner将全部大写转换为小写?

使用 Bash (sed?) 删除包含特定文本 (regex) 的多行 /* ... */ 样式注释