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
选项并将.*?
替换为[^>]*
,因为POSIX BRE/ERE 不支持惰性量词。
作业工具错误。必填历史链接:***.com/a/1732454/14122
.*?
在 either BRE 或 POSIX ERE 中不支持语法。 \U
也不是——在使用它时,您依赖于非标准扩展(由您的操作系统的 sed
副本提供,因为该工具不是 bash 的一部分并且因平台而异)。
...所以,如果你想正确,请使用真正的 html 解析器——Python 的 lxml.html
是一个很棒的解析器。 sed
失败的情况不仅仅是小而晦涩——将<h1>
放在一行,将文本放在第二行,将</h1>
放在第三行,您的代码会忽略那里有一个标签。或者将h:xmlns="http://www.w3.org/1999/xhtml"
放在封闭范围内,它必须是<h:h1>
才能被识别,但sed
无法知道这一点。或者改成<h1 class="whatever">
,相当于一个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标签内的大写文本的主要内容,如果未能解决你的问题,请参考以下文章