我正在执行一个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
不是解决方案,只是因为文件应该是可读的。
答案 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
<强>详情:
<!--replace-->
,请转到{..}
:loop
是一个标签(它是你可以去的标记)N
转到下一行,并将下一行追加到模式空间。 <!--/replace-->
,请转到(b
牧场)标签loop
<!--/replace-->
。此时,用替换线替换(c
hange)模式空间。答案 2 :(得分:0)
这可能适合你(GNU sed):
sed '/<!--replace-->/!b;:a;$!{N;/<!--\/replace-->/!ba};c\<script src="3.js"></script>' file