代码之家  ›  专栏  ›  技术社区  ›  Alexandru Popovici

使用SED替换ALT属性中的字符串

  •  2
  • Alexandru Popovici  · 技术社区  · 6 年前

    我有一个包含以下ALT属性的HTML文件:

    alt="Hello I am <nobr>Please&nbsp;replace&nbsp;me</nobr> and I'm cool"
    

    我需要在bash脚本中使用SED将上述行替换为:

    alt="Hello I am Please replace me and I'm cool"
    

    如何仅针对alt属性中的标记?

    3 回复  |  直到 6 年前
        1
  •  1
  •   Joseph Quinsey Taseen    6 年前

    一个 sed 答案是:

     sed -E '/alt=/{:a s/(<nobr>)(.*)&nbsp;(.*)(<\/nobr>)/\1\2 \3\4/;ta; s/<nobr>(.*)<\/nobr>/\1/}'
    

    说明:

    • /alt=/ 仅更改包含 alt=
    • s/(<nobr>)(.*)&nbsp;(.*)(<\/nobr>)/\1\2 \3\4/ 替换一个 &nbsp; 有空间的
    • ta 如果成功,请重复;也就是说,跳到 a
    • s/<nobr>(.*)<\/nobr>/\1/ 最后移除 <nobr> </nobr>

    补充: 因为 塞德 贪婪,这个剧本会 失败 如果有两个 </nobr> 在排队。当有工作要做时--请参阅ishahak answer Non greedy (reluctant) regex matching in sed? --它变成了一种痛苦。

    在任何情况下,这个答案都已经过分了,因为OP发现一个更简单的解决方案足以满足他们的需求;请参阅下面的注释。

        2
  •  1
  •   RavinderSingh13 Nikita Bakshi    6 年前

    如果你同意的话 awk 然后尝试以下操作:(获取要在变量中替换的所有字符串 锥子 )

    awk -v val="<nobr>" -v val1="&nbsp;" -v val2="</nobr>" '
    /^alt/{
      gsub(val," ")
      gsub(val1," ")
      gsub(val2," ")
    }
    1'  Input_file
    

    或者

    awk -v val="<nobr>" -v val1="&nbsp;" -v val2="</nobr>" '
    /^alt/{
      gsub(val"|"val1"|"val2," ")
    }
    1'  Input_file
    

    追加 > temp_file && mv temp_file Input_file 以上代码,以防您想对输入文件本身进行更改。

        3
  •  0
  •   keithpjolley    6 年前

    这是一种不礼貌的做法:

    % sed $'s#alt="Hello I am <nobr>Please&nbsp;replace&nbsp;me</nobr> and I\'m cool"#alt="Hello I am Please replace me and I\'m cool"#' < file.html
    

    我的建议是不要使用shell工具解析html,这只会导致眼泪和挫败感。使用python的 BeautifulSoup 取而代之的是模块。