我有一个HTML文件,其中包含以下ALT属性:
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属性内的标记?
sed
的答案是:
sed -E '/alt=/{:a s/(<nobr>)(.*) (.*)(</nobr>)/12 34/;ta; s/<nobr>(.*)</nobr>/1/}'
说明:
/alt=/
仅更改包含alt=
的行s/(<nobr>)(.*) (.*)(</nobr>)/12 34/
用空格替换一个
- 成功则
ta
重复;即跳转到a
s/<nobr>(.*)</nobr>/1/
最终移除<nobr>
和</nobr>
添加:因为sed
是贪婪的,如果行中有两个</nobr>
,此脚本将失败。虽然有解决方法——请参阅ishahak对sed中非贪婪(不情愿(正则表达式匹配的回答--它变成了一种痛苦。
无论如何,这个答案已经是小题大做了,因为OP发现一个简单得多的解决方案就足以满足他们的需求;请参阅下面的评论。
如果您对awk
满意,请尝试以下操作:(在awk
的变量中替换所有字符串(
awk -v val="<nobr>" -v val1=" " -v val2="</nobr>" '
/^alt/{
gsub(val," ")
gsub(val1," ")
gsub(val2," ")
}
1' Input_file
或
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
附加到以上代码中。
这里有一种笨拙的方法:
% 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模块。