我的问题:如何查找具有不匹配的左尖括号的行,并将这些括号替换为其HTML等效项。
示例输入:
<dd>
Pro 10g Flüssigkeit: 2g Wasserstoffperoxid <10% Tenside. ENTHÄLT: Sulfamidsäure,</dd>
通过替换不匹配的&lt;&lt; 10%&#39>来预期输出字符串:
<dd>
Pro 10g Flüssigkeit: 2g Wasserstoffperoxid <10% Tenside. ENTHÄLT: Sulfamidsäure,</dd>
有德国&#39; Umlaute&#39;包含在我的示例文本中以防万一他们可以搞砸了某些内容&#39; ...
如果可能,我想使用sed或awk。
我看过: Use sed with regex and (,How to decrement (substract) number in file with sed和 sed - regex square brackets detection in Linux和其他Q&amp; A但我似乎无法理解正则表达式。遗憾!
非常感谢你的帮助!
答案 0 :(得分:2)
这是一个危险的提案,因为sed
逐行工作,对于每一行,有几种情况需要考虑:
可能只有没有任何html标签的小于字符:
<p>
x < 10
</p>
在你的例子中,可能有一个html标签,在小于号的字符
之后<p> x < 10 </p>
小于字符可以在html标记内。
<img src="..." alt="Graph for x < 10">
它可能是一个非常长的html标签,在后面的行中关闭。
<img
src="..."
alt="..."
>
我要做的是首先假设只有前两个选项存在,然后使用这样的东西:
sed -i.orig -r 's/<([^>]*($|<))/\<\1/g' file.
这将使用新扩展程序.orig
保留原始文件的备份,以便您可以在两者上运行diff
程序以查看更改的内容。
至于如何运作:
s/AAA/BBB/g
将所有AAA
替换为BBB
s/A(CC)/B\1/g
将ACC
替换为BCC
,即为\1
[^>]*
表示 <{strong> >
以外的任何字符中的零个或多个($|<)
可以是行尾或<
,以先到者为准。因此它会在<
之前搜索>
,直到下一个<
或该行的结尾,并用<
替换该部分及其所有内容在初始<
答案 1 :(得分:1)
这可能足够好了:
$ sed -E 's/<([^>]+<)/\<\1/g' file
<dd>
Pro 10g Flüssigkeit: 2g Wasserstoffperoxid <10% Tenside. ENTHÄLT: Sulfamidsäure,</dd>
如果没有,那么编辑你的问题提供一个更完整(但仍然简洁和可测试)的例子,真正代表你真实的输入。
关于变音符号或任何其他输入字符btw没什么特别的。