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

时间:2018-08-03 16:58:53

标签: bash sed

我有一个包含以下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 个答案:

答案 0 :(得分:1)

如果您对awk感到满意,请尝试执行以下操作:(将所有要替换的字符串替换为awk的变量)

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

OR

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

如果要对Input_file本身进行更改,请将> temp_file && mv temp_file Input_file附加到上述代码中。

答案 1 :(得分:1)

一个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>

已添加:由于sed贪婪,因此如果该行中有两个</nobr>,则此脚本将失败。尽管有变通办法-参见ishahak的answerNon greedy (reluctant) regex matching in sed?-却很痛苦。

无论如何,这个答案实际上已经过高了,因为OP发现更简单的解决方案足以满足他们的需求;参见下面的评论。

答案 2 :(得分:0)

这是一种笨拙的方式:

% 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模块。