sed匹配模式和替换在HTML中

时间:2013-12-06 12:34:00

标签: regex sed awk

我想用特定的html标签替换文本,例如html文件

<html>
<head>
original text
<title>original text</title>
original text
<head>
<body>
original text
</body>
</html>

这里我想用“修改”替换文本“原始”只在标签“标题”之间我尝试了以下但是除了标题标签之外的所有地方都取代了。我确实需要保持全球“g”。

 sed -i '' '/<title>/,/<\/title>/ s/original/modified/g' test.html

另外,我不明白为什么我的脚本中需要''(两个单引号),例如这个有效(用双引号)

 sed -i -e "s/original/modified/g" test.html

如果我有匹配模式,那么下面的一个不起作用

 sed -i -e "/first/,/last/ s/original/modified/g" test.html

我需要''让它在下面工作

  sed -i '' '/first/,/last/ s/original/modified/' test.html

我使用的是Mac OSX 10.9,也不确定更好的方法。感谢

2 个答案:

答案 0 :(得分:2)

First''是由选项-i

引起的
  

-i[SUFFIX]' - 就地[= SUFFIX]”        此选项指定要就地编辑文件。 GNU        `sed'通过创建临时文件并将输出发送到来完成此操作        这个文件而不是标准输出。(1)。

默认情况下逐行工作,模式地址(/ start /,/ end /)定义要开始的行,直到包含结束部分的哪一行包含在你的情况下哪一行在同一行,sed从和开始停在文件的末尾,而不是像预期的那样

假设你的情况总是在同一行

sed -i '' '/<title>/ {
: loop
   s|\(<title>.*\)original\(.*</title>\)|\1modified\2|
   t loop
   }' test.html

答案 1 :(得分:1)

您也可以使用awk

awk '/title/ {sub(/original/,"modified")}1' test.hmtl
<html>
<head>
orginal text
<title>modified text</title>
original text
<head>
<body>
original text
</body>
</html>

更改原始文件

awk '/title/ {sub(/original/,"modified")}1' test.hmtl > tmp && mv tmp test.hmtl