0

我正在执行一个 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在这种情况下,从文件中删除不是解决方案,仅仅是因为文件应该是可读的。

4

3 回答 3

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 的解决方案,如此处所述: 如何告诉 sed “点匹配新行”

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.
于 2012-10-31T06:55:34.317 回答
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)模式空间。
于 2012-10-31T17:29:51.447 回答
0

这可能对您有用(GNU sed):

sed '/<!--replace-->/!b;:a;$!{N;/<!--\/replace-->/!ba};c\<script src="3.js"></script>' file
于 2012-10-31T11:10:18.717 回答