2012-04-09 26 views
1

ファイル内の文字列を少しbashスクリプトで置き換える必要がありますが...私は奇妙な結果を得ています。ファイル内の文字列をbashスクリプトから置き換えてください

はのは、私が交換したいとしましょう:

<tag><![CDATA[text]]></tag> 

で:

<tag><![CDATA[replaced_text]]></tag> 

私はsedを使用する必要がありますか?私はこれをアプローチする最良の方法だろう何

...私は奇妙な結果を取得しています/[]によると思いますか?

答えて

3

はい、括弧をエスケープし、スラッシュをエスケープするか、別の区切り文字を使用する必要があります。それは正規表現を使用することになるとSGMLとXMLは、実際にHTMLよりも良くはない、と述べた

sed 's,<tag><!\[CDATA\[text\]\]></tag>,<tag><!\[CDATA\[replaced)text\]\]></tag>,' 

。これが一般化するとは思わない。 -pオプションを

4

Perlはほぼ同じSED動作し、それは、その正規表現のための\ Q(引用符)スイッチがあります。

perl -pe 's{\Q<tag><![CDATA[text]]></tag>} 
      {<tag><![CDATA[replaced_text]]></tag>}' YOUR_FILE 

をとPerlで、あなたはあなたの表現(複数可{区切り文字に別の句読点を使用することができます。.. 。} {...}私の例では)。

+1

+1の '\ Q'。引用符を終わらせるには、リテラル文字列に '\ E' – Gowtham

+0

+1を使用します。 '\ E'やその他の特殊なシーケンスの埋め込みを避けるために、元のテキストや置換テキストをエスケープする方法へのリンクがあれば、これはさらに優れています。 – l0b0

0

これは十分なはずです:

$ echo '<tag><![CDATA[text]]></tag>' | sed 's/\[text\]/\[replaced_text\]/' 
<tag><![CDATA[replaced_text]]></tag> 


ます。また、内部,|または%のような別の文字にsedをご/区切りを変更することができます。

sed -i 's#<tag><!\[CDATA\[text\]\]></tag>#<tag><![CDATA[replaced_text]]></tag>#g' filename 

-iファイルの代わりに、それをプリントアウトを変更sedをしているために:

0

ただ、ここで私は#を使用して、/以外の区切り文字を使用します。 gは複数回マッチングするためのものです(グローバル)。

しかし、一致させる正確な文字列は、タグとテキストの両方を知っていますか?あなたはreplaced_textですべてのテキストを置換したい場合は例えば は、:

perl -i -pe 's#(<tag><!\[CDATA\[)(.*?)(\]\]></tag>)#\1replaced_text\3#g' filename 

は非欲張り乗算器をサポートしていませんsedのためのperlに切り替え(*?)。

関連する問題