【问题标题】:Replace character only in certain string仅替换特定字符串中的字符
【发布时间】:2014-09-10 10:00:09
【问题描述】:

我需要将 html 文件中的每个“_”替换为“-”,但只能在标签中,并且只能在“name”属性中。

所以每一个:

<a name="menu_portlet_test"> or <a name="whatever_is_here">

应该变成这样:

<a name="menu-portlet-test"> and <a name="whatever-is-here">

不知道如何强制 sed/awk 之类的东西来做。救命!

【问题讨论】:

  • 使用 sed/awk 解析 HTML,避免,避免,避免。
  • 看看this answer
  • @AvinashRaj: 这个 '' 也匹配
  • @walidtoumi 试试这个perl -pe 's/(?:&lt;\S+\b[^&lt;&gt;]*? \bname="|(?&lt;!^)\G)[^"_ ]*\K_/-/g' file
  • @AvinashRaj:谢谢

标签: regex linux bash awk sed


【解决方案1】:
sed ':a
s/\(<[^>]* name="[^"]*\)_\([^"]*"\)/\1-\2/g;ta' YourFile

应该做你们大多数人的工作。由于顶级 html 的可能性并不完美,但应该是 99,9% ok

解释

s//g

  • 搜索模式 (&lt; 后跟任何非 &gt; ([^>]) followed by name="followed by (any non"([^"]) ) [ as group 1] followed by[so firstbetween quote after name=] followed by ( any non"([^"]*) followed by"`) [作为第 2 组]
  • 将其替换为第 1 组的内容,然后是 -,然后是第 2 组的内容
  • g 为在线上的任何事件执行此操作。此更改 1 _ per name="" 但在该行的任何 name= 上。 &lt;... name="bla_bla_bla"&gt; ... &lt;... name="other_bla_bla"&gt; ... 更改为 &lt;... name="bla-bla_bla"&gt; ... &lt;... name="other-bla_bla"&gt; ...

ta

  • 如果之前的s//发生变化,用修改后的内容重做同样的动作(实际上是一个if/goto标记:a

【讨论】:

  • 似乎可以解决问题,谢谢,现在我必须弄清楚它是如何工作的:)。编辑:啊!一个循环,太棒了!
  • 添加了一些注释来解释
【解决方案2】:

使用适当的 HTML 处理工具,例如 xsh,一个围绕 Perl's XML::LibXML 的包装器。以下命令可以保存在脚本中,也可以从其交互环境中输入:

open :F html file.html ;
for //@name set . xsh:subst(., '_', '-', 'g') ;
save :b ;

【讨论】:

  • 看起来很有趣,那么这些命令是在交互式 shell 中运行的吗?也许答案中的更多细节会很有用。
猜你喜欢
  • 1970-01-01
  • 2012-08-09
  • 1970-01-01
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多