sed替代品没有按预期工作

时间:2012-10-31 06:24:02

标签: regex shell sed

我正在执行一个shell脚本,我应该替换文件中的字符串。所以当然我正在使用sed。字符串类似于:

<!--replace-->
<script src="1.js"></script>
<script src="2.js"></script>
<!--/replace-->

这应该替换为:

<script src="3.js"></script>

所以我试着这样做:

$ sed "s/<\!--replace-->.\*<\!--\/replace-->/<script src=\"3.js\"><\/script>/g" file.html

但这不是诀窍。我错过了什么?

UPD:在这种情况下,从文件中删除\n不是解决方案,只是因为文件应该是可读的。

3 个答案:

答案 0 :(得分:1)

问题与换行有关,您可以更改正则表达式以匹配换行符,或删除换行符 使用tr

user@machine:/tmp$ cat s.txt 

<!--replace-->
<script src="1.js"></script>
<script src="2.js"></script>
<!--/replace-->

user@machine:/tmp$ tr "\n" " " < s.txt | sed "s#<\!--replace-->.*<\!--/replace-->#<script src="3.js"></script>#g" 

<script src=3.js></script> 

如果您不想删除换行符,可以:

a)尝试使用SED的解决方案,如下所述: how to tell sed "dot match new line"

b)使用perl或python替换多行正则表达式,使用s修饰符,换行符将保持不变:

user@mmmm:/tmp$ cat s.txt 

<!--replace-->
<script src="1.js"></script>
<script src="2.js"></script>
<!--/replace-->

Dummy content containing
newlines for test.

user@mmmm:/tmp$ perl -i -pe 'BEGIN{undef $/;} s#<\!--replace-->.*<\!--/replace-->#<script src="3.js"></script>#gsm' s.txt 

user@mmmm:/tmp$ cat s.txt 

<script src="3.js"></script>

Dummy content containing
newlines for test.

答案 1 :(得分:1)

以下是一种方法:删除(d)从包含<!--replace-->的行开始到包含<!--\replace-->的行的所有行。但是对于块的第一行,在删除之前插入(i)替换行。

sed '/<!--replace-->/,/<!--\/replace-->/ {
         /<!--replace-->/ i\<script src="3.js"></script>
         d      
     }' file

另一种方法是将整个块附加到模式空间中,然后用替换线替换模式空间(即替换整个块)。

sed '/<!--replace-->/ {
         :loop
         N
         /<!--\/replace-->/ ! b loop
         c\<script src="3.js"></script>
     }' file

<强>详情:

  1. 如果该行包含<!--replace-->,请转到{..}
  2. :loop是一个标签(它是你可以去的标记)
  3. N转到下一行,并将下一行追加到模式空间。
  4. 如果该行不包含<!--/replace-->,请转到(b牧场)标签loop
  5. 重复3-4,直到行包含<!--/replace-->。此时,用替换线替换(c hange)模式空间。

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed '/<!--replace-->/!b;:a;$!{N;/<!--\/replace-->/!ba};c\<script src="3.js"></script>' file