0

ファイル内の文字列を置き換えるシェルスクリプトを実行しています。もちろん、私はそのために使用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 に "dot match new line" を伝える方法

sb) perl または python を使用して複数行の正規表現を修飾子で置き換えると、改行はそのままになります:

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

これを行う 1 つの方法は次のとおりです: を含むd行から始まるすべての行を削除 ( ) します。ただし、ブロックの最初の行については、削除する前に置換行を挿入 ( ) します。<!--replace--><!--\replace-->i

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

もう 1 つの方法は、パターン スペースにブロック全体を追加してから、パターン スペースを置換行で置き換える (つまり、ブロック全体を置き換える) ことです。

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

詳細

  1. 行に が含まれている場合は<!--replace-->{..}
  2. :loopラベルです(移動できるマーカーです)
  3. N次の行に移動し、次の行をパターン スペースに追加します。
  4. 行に が含まれていない場合は<!--/replace-->、( branch) ラベルに移動します。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 に答える