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



我有一个HTML文件,其中包含以下ALT属性:

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属性内的标记?

sed的答案是:

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

说明:

  • /alt=/仅更改包含alt=的行
  • s/(<nobr>)(.*)&nbsp;(.*)(</nobr>)/12 34/用空格替换一个&nbsp;
  • 成功则ta重复;即跳转到a
  • s/<nobr>(.*)</nobr>/1/最终移除<nobr></nobr>

添加:因为sed是贪婪的,如果行中有两个</nobr>,此脚本将失败。虽然有解决方法——请参阅ishahak对sed中非贪婪(不情愿(正则表达式匹配的回答--它变成了一种痛苦。

无论如何,这个答案已经是小题大做了,因为OP发现一个简单得多的解决方案就足以满足他们的需求;请参阅下面的评论。

如果您对awk满意,请尝试以下操作:(在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

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

这里有一种笨拙的方法:

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

最新更新