2017-01-09 7 views
0

私はxmlファイルを持っています。データを追加する必要があります。私はsedを使ってみました。誰かが私が間違っているところで私を助けてくれますか?xmlファイルをシェルスクリプトを使ってxmlファイルに追加

<sfuser xid="user1000"> 
      <username>beq03838</username> 
      <email>[email protected]</email> 
      <alternateEmail1></alternateEmail1> 
      <dateCreated>2016-12-20 14:02:23 CET</dateCreated> 
      <dateLastModified>2016-12-20 14:02:23 CET</dateLastModified> 
      <detail></detail> 
      <monitoringPreference>email</monitoringPreference> 
      <lastLogin></lastLogin> 
     </sfuser> 

そして、私の出力は以下のようになります:

enter <!DOCTYPE sf-migration 
PUBLIC "-//VA Software, Inc.//DTD SourceForge Migration 1.0//EN" 
"/opt/add-ons/import-6.1/dtd/sf-migration_1_0.dtd"> 
<sf-migration toVersion="6.1.0.0" fromVersion="5.0.0.0"> 
<users> 
<sfuser xid="user1000"> 
<username>beq03838</username> 
<email>[email protected]</email> 
<alternateEmail1></alternateEmail1> 
<dateCreated>2016-12-20 14:02:23 CET</dateCreated> 
<dateLastModified>2016-12-20 14:02:23 CET</dateLastModified> 
<lastLogin></lastLogin> 
</sfuser> 
</users> 
</sf-migration> 

<!DOCTYPE sf-migration 
PUBLIC "-//VA Software, Inc.//DTD SourceForge Migration 1.0//EN" 
"/opt/add-ons/import-6.1/dtd/sf-migration_1_0.dtd"> 
<sf-migration toVersion="6.1.0.0" fromVersion="5.0.0.0"> 
<users></users> 
</sf-migration> 

は、今私は、ユーザーに下記のファイルを追加する必要があります。

は、私はこのようなxmlファイルを持っています

以下のシェルスクリプトを使用して、テキストを追加します。

CONTENT=give the suer content 
C=$(echo $CONTENT | sed 's/\//\\\//g') 
sed "/<\/users>/ s/.*/${C}\n&/" /tmptest/user1.xml 

何が間違っていますか? xmlに要素を追加する他の簡単な方法はありますか? 私は完全なコードがシェル内にあるので、これはシェルで行う必要があります

+0

あなたは何を得ているのですか?そして、出力の最初の単語としての "入力"は意図されていますか?ありがとうございます。 –

答えて

0

複数のファイルを操作してコマンドラインでエスケープするのは、エラーが起こりやすくハッキリです。あなたは、ほとんどの言語で実際に小さなスクリプトで同じことを達成することができます。ここではPython 2の例を示します。

template = open("user.xml").read() 
snippet = open("user_data.xml").read() 
result = template.replace("</users>", snippet + "</users>") 
open("user.xml", "w").write(result) 

出力:

<!DOCTYPE sf-migration PUBLIC "-//VA Software, Inc.//DTD SourceForge Migration 1.0//EN" "/opt/add-ons/import-6.1/dtd/sf-migration_1_0.dtd"> <sf-migration toVersion="6.1.0.0" fromVersion="5.0.0.0"> 
<users> 
    <sfuser xid="user1000"> 
      <username>beq03838</username> 
      <email>[email protected]</email> 
      <alternateEmail1></alternateEmail1> 
      <dateCreated>2016-12-20 14:02:23 CET</dateCreated> 
      <dateLastModified>2016-12-20 14:02:23 CET</dateLastModified> 
      <detail></detail> 
      <monitoringPreference>email</monitoringPreference> 
      <lastLogin></lastLogin> 
    </sfuser> 
</users> 

あなたはより頻繁にこれを実行する必要がある場合は、このスクリプトを使用します。

#!/usr/bin/python 

import sys 
if len(sys.argv) != 4: 
    print "This script prepends the given pattern in a template with a snippet. Both snippet and template are files." 
    print "Usage:" 
    print sys.argv[0] + " template snippet replacementpattern" 
    sys.exit(1) 

template = open(sys.argv[1]).read() 
snippet = open(sys.argv[2]).read() 
pattern = sys.argv[3] 

if not pattern in template: 
    print "Template doesn't contain the pattern." 
    sys.exit(2) 

print template.replace(pattern, snippet + pattern) 

使用方法:

./prepend.py template.xml snippet.xml "</users>" 
+0

最初のオプションでは出力だけを出力します。しかし、結果の出力をソースファイル(テンプレート)に保存する必要があります –

+0

出力をファイルにリダイレクトするか、Pythonを使用してください: 'open(" template.xml "、" w ")。write(result)' –

+0

できますか私にフォーマットを教えてください? #!は/ usr/binに/ pythonの テンプレート=オープン( "user.xml"、 'RW')。(読み) スニペット=オープン( "user_data.xml")。(読み) 印刷テンプレート.replace(「」、+「を」スニペット) それが含まあなたの要求で更新 –

関連する問題