• 締切済み

Linux シェルスクリプトでの XML 読み込み

次のような xml があります。 ------------------------------------------------------------------------------------------------------------------ <?xml version="1.0" ?> <ROOT> <hoge> <fuga> <piyo>/var/log/tokyo</piyo> <hogera>7</hogera> <hogehoge>*.log</hogehoge> </fuga> <fuga> <piyo>/var/log/osaka</piyo> <hogera>3</hogeara> <hogehoge>*.log</hogehoge> </fuga> </hoge> <foo> <bar> <baz>/media/tokyo/tokyo.zip</baz> <qux>/var/log/tokyo</qux> <quux>7</quux> <foobar>*.log</foobar> </bar> <bar> <baz>/media/osaka/osaka.zip</baz> <qux>/var/log/osaka</qux> <quux>3</quux> <foobar>*.log</foobar> </bar> </foo> </ROOT> ------------------------------------------------------------------------------------------------------------------ 1)要素 qux の値を取り出してパスを評価 2)パスが存在すれば要素 foobar の条件に一致したファイルを要素 baz にアーカイブする というシェルスクリプトを作成したいのですが、良い方法が分かりません ご教授いただければ幸いです。

みんなの回答

  • akira1720
  • ベストアンサー率80% (127/158)
回答No.2

grep コマンドでタグにマッチする行を取り出し、sed コマンドでタグに挟まれた要素の部分以外を消し、その結果をバッククォートを使って変数に入れればあとはそれらの変数を引数にして zip コマンドを実行すればいいのでは。

  • _kappe_
  • ベストアンサー率68% (1522/2216)
回答No.1

XMLファイルから値を取り出す部分にはxmllintコマンドを使う方法があります。 https://www.google.com/search?q=xmllint+%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88

関連するQ&A

  • 値を取得できない

    var hoge = {   piyo: {     bar = /* ここにhogehoge.fooの値を入れたい */   },   foo: "Hello, World!" } でhoge.piyo.barからhoge.fooの値を取得したいのですが、 hoge.fooとやってもthis.fooとやっても取得できません。 どうすれば取得できるのでしょうか?

  • hogehoge.exe AAA.sf2 AAA.cfgを自動化(コマンドプロンプト)

    こんにちは。himajin2009です。 #どれに分類していいか判らない。WindowsXPで行くべきだったかも 超基礎的なことかもしれませんが、ちょっとコマンドが判らないので聞かせていただきます。 C:\SoundFontには hoge.sf2 hogehoge.sf2 piyo.sf2 foo.sf2 bar.sf2 というファイルが入っており、cfgforsf.exeという アプリケーションがあります cfgforsf foo.sf2 himajin.cfg とやることで、foo.sf2のデータを処理したものがhimajin.cfgが出力されます。 さて、今回やりたいのは、 cfgforsf foo.sf2 foo.cfg cfgforsf bar.sf2 bar.cfg cfgforsf hoge.sf2 hoge.cfg cfgforsf piyo.sf2 piyo.cfg ・・・・と、そのディレクトリ内の全てのファイルに対してcfgファイルを生成することです。 dir /Bを利用すると思うのですが...その先が判りません 回答お願いします

  • ダブルクォートで囲まれた文字列の取り出し

    Windows環境でRuby 1.8.7を使用しております。 ----sample1.txt----- hoge"foo\"bar\"foo"hage"bar\"baz\"bar"hoge ------------------ ファイルから1行ずつテキストを読み込んで処理を行います。上のsample.txtの様な行を読み込んだ場合にダブルクォートで囲まれた部分 foo\"bar\"foo bar\"baz\"bar を取り出すのにはどの様な正規表現を用いればよろしいでしょうか? エスケープされたダブルクォートを除ける上手い方法がわかりません。 また、ダブルクォートで囲まれた部分が複数行にまたがる場合はどの様に処理をすれば良いでしょうか? -----sample2.txt----- hoge"foo \"bar\" baz" hage ---------------------- -----sample3.txt----- hoge"foo \"ba r\"baz" hage ---------------------- 最初の例のように1行の場合は File.foreach(file) do | line | …… end で良いのですが、複数行の場合には同じように単純には行きません。 ダブルクォートの数を数えて、奇数の場合は偶数になるまで次行をくっつける様な処理を考えているのですが、もっと適切な方法はありますか? 宜しくお願いします。

  • XMLからJavaObjectへのバースについて

    XMLで以下のような設定ファイルを作ったとします。 <hoge>  <foo name="foofoo">   <bar name="bar1" />   <bar name="bar2" />  </foo> </hoge> この設定ファイルをJavaObjectにバースする場合、 現状バインディングツールを使用してバースしているのですが、 これではバースを行うクラスと、入れ物となるクラスの2つが必要です。 この状態だと設定ファイルのフォーマット変更時に修正範囲が大きくなりますのであまりよろしくありません。 そこで質問なのですが、 XMLと定義ファイル(dtdファイル)を渡してあげれば、 入れ物となるクラスにデータをバースして入れてくれる ツール・ライブラリ等は存在しないのでしょうか? どなたかご存知の方がいらっしゃいましたらご指導よろしくお願いします。

    • ベストアンサー
    • Java
  • chmod u-x .*の動作について教えて下さい

    パーミッション変更作業中に 「chmod u-x .*」としたところ予期しない動作をしました。 私事ですが、 先日これで、サーバを停止させてしまい始末書を書きました。 原因はわかったのですがコマンドの動作に理解できずに困っています。 詳しい方がおられましたら、ご教授お願いします。 よろしくお願いします。 問題は、カレントディレクトリで .(ドット)から始まる全てのファイルに対して ユーザの実行権限を削除するということで 下記のコマンドを実行しました。 「chmod u-x .*」 その結果、親と親の親ディレクトリの 実行権限まで変わってしまったということです。 カレントディレクトリには、 下記のファイル(ディレクトリ)があります。 . .. .bash_history .bash_logout .bash_profile .bashrc 「..」が変更対象に含まれている為、 「../foo」親ディレクトリが変更対象になります。 「../bar」が変更対象に含まれないのは、 「..」でも直接親子関係にないから変更対象に入らない。 そのため、 「../../home」も同じ理由で親子関係にないから変更対象に入らない と思っています。 確認した環境は RHEL4とFedora6ですどちらも結果は同じ。 ■下記に実行したコマンドを記載します。 (文字数に制限があるようなので、内容を一部加工させて頂きました。) 【コマンド入力前のパーミッション】 [root@baz /]# ls -la / | grep home drwxr-xr-x 4 root root 4096 1月 9 1:01 home [root@baz /]# ls -la /home 合計 28 drwxr-xr-x 4 root root 4096 日時 . drwxr-xr-x 3 root root 4096 日時 .. drwx--x--x 1 bar bar 4096 日時 bar drwx------ 5 foo foo 4096 日時 foo [root@baz foo]# ls -la 合計 40 drwx------ 5 foo foo 4096 日時 . drwxr-xr-x 4 root root 4096 日時 .. -rw------- 1 foo foo 165 日時 .bash_history -rw-r--r-- 1 foo foo 24 日時 .bash_logout -rw-r--r-- 1 foo foo 176 日時 .bash_profile -rw-r--r-- 1 foo foo 124 日時 .bashrc drwx------ 5 foo foo 4096 日時 Maildir drwxr-xr-x 2 foo foo 4096 日時 etc drwxr-xr-x 2 foo foo 4096 日時 public_html 【問題のコマンドを実行】 [root@baz foo]# pwd /home/foo [root@baz foo]# chmod u-x .* 【コマンド入力後のパーミッション】 [root@baz foo]# ls -la 合計 40 drw------- 5 foo foo 4096 日時 . drw-r-xr-x 4 root root 4096 日時 .. -rw------- 1 foo foo 165 日時 .bash_history -rw-r--r-- 1 foo foo 24 日時 .bash_logout -rw-r--r-- 1 foo foo 176 日時 .bash_profile -rw-r--r-- 1 foo foo 124 日時 .bashrc drwx------ 5 foo foo 4096 日時 Maildir drwxr-xr-x 2 foo foo 4096 日時 etc drwxr-xr-x 2 foo foo 4096 日時 public_html [root@baz /]# ls -la /home 合計 28 drw-r-xr-x 4 root root 4096 日時 . drwxr-xr-x 3 root root 4096 日時 .. drwx--x--x 1 bar bar 4096 日時 bar drw------- 5 foo foo 4096 日時 foo [root@baz /]# ls -la / | grep home drw-r-xr-x 4 root root 4096 日時 home

  • 正規表現について

    下記期待する結果通りになる正規表現を考えておりますが、 うまくいきません。教えて下さい。 期待する結果 hoge(fuga sumomo) マッチする hoge(foo(sumomo)) アンマッチする sumomoが()で囲われている hoge(bar()sumomo) マッチする 作成した正規表現 hoge\([^(]*sumomo[^)]*\) 実際の結果 hoge(fuga sumomo) マッチ hoge(foo(sumomo)) アンマッチ hoge(bar()sumomo) アンマッチ ←予想と違う

  • VB(2008)で文字列の置き換え

    Dim a As String Dim b As String a = TextBox1.Text b = a.Replace("hogehoge", "fuga") b = a.Replace("piyo","xyzzy") b = a.Replace("foo", "bar") Textbox2.Text= b のようにしているのですが、置き換えることができません。 初歩的な内容ですがどなたかよろしくお願いします。

  • URLの一部をコピーできるブックマークレット

    後述のようなブックマークレットを作りたいのですが、 ブックマークレットを作ったことがなくまったくわかりません。 どなたか、どんなブックマークレットになるかお教えいただけませんでしょうか? --------------------------------------------------------------------- どこかのページを表示中に、そのブックマークレットをクリックすると、 ●そのURLのFQDNより後ろの部分だけをクリップボードにコピーし、 ●コピーしたら「(そのコピーした部分)をコピーしました」とJavaScriptの確認アラートを表示させたいです。 --------------------------------------------------------------------- 例1) 「http://www.example.com/foo.html」 ↓ ●「/foo.html」をコピーする ●『foo.html をコピーしました』とJSで確認アラートが出る。 例2) 「http://www.example.com/foo/bar/hoge/fuga.html」 ↓ ●「/foo/bar/hoge/fuga.html」をコピーする ●『/foo/bar/hoge/fuga.html をコピーしました』とJSで確認アラートが出る。 ※なお、FQDNは固定です(ここでは仮に、www.examepl.comとしてますが) --------------------------------------------------------------------- 以上、よろしくお願い申し上げます。

  • foo bar baz qux・・・・?

    himajin2003の頃 「hogeの意味」について聞いたことがあったが 今回はその第二弾である。 今日、あるサイトのコンテンツを見ていたら 「quxは知る人ぞ知る、foo bar bazの次である」という記述を見つけた。 基本的に僕が見たことがあるのはfoo bar までであり、今日知ってびっくりした。 さて、これって何の順番なのでしょう? 何が根拠なのでしょう?

  • ActionScript3で複数のXMLを順番に読み込めずに最後のXM

    ActionScript3で複数のXMLを順番に読み込めずに最後のXMLだけ読んでしまいます。 あるサイトからXMLファイルを順番に読み込んで その中のデータを順番に処理する(trace(hoge);で表示する) スクリプトを書いていますが、なぜか最後のlist3.xmlの データだけが表示されてしまいます。 URLが複数だと、list1.xmlとlist2.xmlの部分だけ 以下のエラーが出るのです。 TypeError: Error #1010: 条件は未定義であり、プロパティがありません。 at _fla::MainTimeline/xmlLoad() at flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction() at flash.events::EventDispatcher/dispatchEvent() at flash.net::URLLoader/flash.net:URLLoader::onComplete() URLが1つだとエラーがでないので益々意味が分からず 混乱しています。何故か分かる方は教えて欲しいです。 宜しくお願いします。 //■■■■■■■■■■■■■■■スクリプトここから import flash.net.URLLoader; import flash.net.URLRequest; var xmlUrl = new Array(); xmlUrl[0] = "http://hogehoge.com/list1.xml"; xmlUrl[1] = "http://hogehoge.com/list2.xml"; xmlUrl[2] = "http://hogehoge.com/list3.xml"; var rss:XML; var xmlData:URLLoader; for each (var k:String in xmlUrl){ xmlData = new URLLoader(); xmlData.load(new URLRequest(k)); xmlData.addEventListener(Event.COMPLETE,xmlLoad); function xmlLoad(event:Event):void{ rss = new XML(xmlData.data); var hoge ; for (var i:int = 0; i <= 1; i++) { hoge = rss.status[i].text; trace(hoge); } } } //■■■■■■■■■■■■■■■スクリプトここまで

    • ベストアンサー
    • Flash