2016-06-29 10 views
0

xmlタグ間に長い1行の文字列を持つファイルがあります。タグ間の内容をsedに置き換えたいと思います。2つのパターン間の複数の文字列をsedに置き換える

1300_character_long_string_here

私がいる問題は、sedのは、私は私の正規表現が適切に選択されていることを知っているにもかかわらず、交換されていないということです。それは、たとえ私が適切に選択して置き換えることができたとしても、ファイルから置き換えられた文字列を(大体は長いほど)引っ張って配置する方法を知らない。ここで

は、コマンドでの私のより多くの成功を収め、現在の試みの一つである:

sed 's/\<Tag\>(.*)\<\/Tag\>/REPLACE/g' test.txt> out.txt 

、これは動作しませんが、私はそれを見ることができます私は最初のタグを交換しようとすると、交換されています。

これは、これがGNUシステムではなく、AIXシステムであることを最初に述べたはずです。

+1

'#\ (。*)\ <\/Tag\>#REPLACE#g''を試しましたか? – Beta

+0

'replace multiline string [sed]'を検索すると、14個のQ/Asが返されます。あなたはこれらの答えを見ましたか?ほとんどの場合、良いアドバイスがあります。がんばろう。 – shellter

+0

正規表現はxml文書を変更するのには適していません – hek2mgl

答えて

0

私はこのような何かを示唆:

はFile1は、例えば、置換テキストが含まれています

some other string 

File2のは、タグ付けされた行が含まれます

... 
<tag>some string</tag> 
... 

さて、あなたが言うことができます。

sed '1{h;d}; /<tag>/{x;s/^/<tag>/;s/$/<\/tag>/}' File1 File2 

この仕組み:まず、置換ファイルを読み、その単一ラインを配置しますホールドスペースに保存し、出力ストリームから削除します。次に、行が<tag>と一致する場合、置換テキストを保留スペースから取り出し、タグを追加します。

1

あなたはrコマンドでファイルから置換テキストを挿入することができます。

そして、それがword boundariesのために使われているとして、あなたのタグで<>をエスケープしないでください。あなたのパターンが一致しない理由を説明することができます。

+0

右。 @KeigaTideあなたはエスケープが各文字にどのような効果を持っているかを理解しています。あなたは、メタ文字をエスケープする場合(例えば '*')それはリテラルになりますが、あなたは脱出するとき**彼らはメタ文字となり、いくつかのSEDSではいくつかの**リテラル文字は、(例えば、 '+'または、この場合 '<' and '>に'単語の境界になってきてGNU sedで)。もしあなたがよくわからないなら、文字をカプセル化するために '[]'を使い、必要に応じてメタ文字をリテラルに変換するが、誤ってリテラルをメタ文字に変えないようにする。 –

+0

@Kenavoz私の書いたsedはあなたの解を解析できませんので、私はそれを突きつけます。 単語の境界は私が知らなかったものです。ありがとうございます。それは、エスケープ文字を削除すると、文字列全体を選択する正規表現が発生したと述べた。 – KeigaTide

+0

@KeigaTideあなたのパターンの中の '('と ')は後方参照のために使わなければなりません。(基本正規表現モードで' \( 'と' \) 'をエスケープする必要があります。 ' 'の内容と一致するだけでなく、文字列全体に一致します。 – SLePort

関連する問題