2017-09-25 18 views
0

XMLファイルを解析してその一部をコピーするスクリプトを自動化したいと思います。 私が検索しfound a way to do thatが、その2つの静的でない文字列の間にテキストを印刷する

<title> .... </title> 

などの分野でのみ働く私の目的はこの

<datasource enabled="true" jndi-name="java:/db_namePostgresDS" jta="true" pool-name="db_namePostgresDS" spy="false" use-ccm="false" use-java-context="true"> 
    THINGS AND FIELDS IN HERE 
</datasource> 

をコピーして、ちょうど</datasource>後にそれを貼り付けることです。それから私はsedで値を変更します。しかし、私は基本的にそのセクションを倍にしたい。

私はちょうどそれを行う方法を得ることができません、そしておそらくそれはXY問題です。どんな助け?

例:

私は

<datasource enabled="true" jndi-name="java:/db_namePostgresDS" jta="true" pool-name="db_namePostgresDS" spy="false" use-ccm="false" use-java-context="true"> 
THINGS AND FIELDS IN HERE 

を持っていると私は

<datasource enabled="true" jndi-name="java:/db_namePostgresDS" jta="true" pool-name="db_namePostgresDS" spy="false" use-ccm="false" use-java-context="true"> 
    THINGS AND FIELDS IN HERE 
</datasource> 

<datasource enabled="true" jndi-name="java:/MODIFIED_NAME_HERE_PostgresDS" jta="true" pool-name="db_namePostgresDS" spy="false" use-ccm="false" use-java-context="true"> 
    MODIFIED THINGS AND FIELDS IN HERE 
</datasource> 

重要を持つようにしたい:私は(マシンに新しいソフトウェアをインストールしないようする必要があります明示的な顧客要求)。 XMLパーサは、組み込みでない場合は、方法ではありません。

+2

「それはあなたのように見えるので、私は質問 – 123

+0

をしている使用しますWildflyやJBoss EAPからスタンドアロン/ domain.xmlを解析すると、実際にはXMLパーザを使用せずにかなり安全です。これらのツールは、起動時の設定を再フォーマットするためです。 XMLを直接解析するよりもはるかに面倒な解析のテキストです。 –

+0

マシン(顧客の要求)にソフトウェアをインストールしないために...私はポストを変更するんだろう、私はそれを指定している必要がありますXMLパーサ –

答えて

1

I複数行のXMLタグを抽出するsedを使用する:

orig_datasource=$(sed -n '/<datasource/{: l;N;/<\/datasource>/!bl;p}' your_input_file) 

このコマンドは、それが開口<datasourceタグに遭遇し、それが閉鎖</datasource>タグまで凝集した後に結果を出力した後行を集約開始します。 *

XMLタグは、私は両方使用-あるとして、その後ができorig_datasource変数に捕獲され、修正されるだろう:

modified_datasource=$(echo "$orig_datasource" | sed 's/something/else/'); 
echo "$orig_datasource 

$modified_datasource" > target_file 

*:それは失敗する可能性があります多くの方法があります(つまり、 < datasource>は有効なタグで、sedコマンドでは理解できません)、JBoss EAPやWildflyの設定ファイルで作業しているように見えるので、これらのツールは設定ファイルを打ち上げ データをテキストとして解析するよりも、XMLパーサを使用する方が安全で簡単です。

+0

実際にはファイル全体が$ orig_datasource ... (はい、私はWildfly8.1を使用しています) –

+0

@WyattGillette sedコマンドで間違いを修正しました。もう一度やり直せますか? – Aaron

+0

うん、それはほとんど動作している!それは重複も見つけますので、最初に閉鎖マッチ後に停止する方法を見つけなければなりません...それを行う最善の方法は何でしょうか?...しかし、これは大きな前進です! (ちょっと理解して...間違いは何ですか?) 編集:とてもシンプルで、 'q'を 'p'の後に追加しました:) Upvoteはたくさんあり、thnxはたくさん! –

関連する問題