我有一个包含以下ALT属性的HTML文件:
alt="Hello I am <nobr>Please replace me</nobr> and I'm cool"
我需要在bash脚本中使用SED将上面的行替换为:
alt="Hello I am Please replace me and I'm cool"
如何仅将alt属性中的标记作为目标?
答案 0 :(得分:1)
如果您对awk
感到满意,请尝试执行以下操作:(将所有要替换的字符串替换为awk
的变量)
awk -v val="<nobr>" -v val1=" " -v val2="</nobr>" '
/^alt/{
gsub(val," ")
gsub(val1," ")
gsub(val2," ")
}
1' Input_file
OR
awk -v val="<nobr>" -v val1=" " -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>)(.*) (.*)(<\/nobr>)/\1\2 \3\4/;ta; s/<nobr>(.*)<\/nobr>/\1/}'
说明:
/alt=/
仅更改包含alt=
的行s/(<nobr>)(.*) (.*)(<\/nobr>)/\1\2 \3\4/
用空格替换一个
ta
如果成功,请重复;也就是说,跳至a
s/<nobr>(.*)<\/nobr>/\1/
最后删除<nobr>
和</nobr>
已添加:由于sed
贪婪,因此如果该行中有两个</nobr>
,则此脚本将失败。尽管有变通办法-参见ishahak的answer至Non greedy (reluctant) regex matching in sed?-却很痛苦。
无论如何,这个答案实际上已经过高了,因为OP发现更简单的解决方案足以满足他们的需求;参见下面的评论。
答案 2 :(得分:0)
这是一种笨拙的方式:
% sed $'s#alt="Hello I am <nobr>Please replace me</nobr> and I\'m cool"#alt="Hello I am Please replace me and I\'m cool"#' < file.html
我的建议是不要使用Shell工具解析html-只会引起眼泪和沮丧。改用python的BeautifulSoup模块。