2012-03-26 3 views
1

Linuxでツール(チェーン)(sed/bash/...)を検索して、次のことを実現します:ここではXML)は同じ値を見つけ、いくつかのルールでこれらの値をチェックし、オフセットを加えてこれらの値を修正します。(Bash?)番号と制約のファイルをチェックし、番号にオフセットを追加するスクリプト

例は次のようになります。

<!--Origin.txt--> 
<Tree> 
    <Node foo="600" bar="50" /> 
    <Node foo="-300" bar="600" /> 
</Tree> 

私は今、完全にバーを無視するwan'tが、例えばかどうかを確認しますfooはゼロより小さい。そうであれば、fooに1000を加えます。そうでない場合は、そのままにしてください。

<!--Output.txt--> 
<Tree> 
    <Node foo="600" bar="50" /> 
    <Node foo="700" bar="600" /> 
</Tree> 

は、私は小さなパイソン/ Javaプログラムを書くことができますが、私はこれを行うには、より高速のbash/sedの/ ...スクリプトがある賭ける;

+0

私のアプローチ。作品も。しかし、大きなファイルでは遅すぎるので、O(n²)がかかります:シェルスクリプトでは、sedですべての値を抽出し、それらを1つずつチェックし、sedで異なる場合は置き換えます。ケントの解決策は良い方法です! – powerbar

答えて

0

を入力し、VIMを使用してファイルを開く:

:%s/foo="\zs\(-[0-9]\+\)"\ze/\=submatch(1)+1000/g 

、ジョブ4のuを行う必要があります。あなたの新しい要件のために働くoneliner

EDIT

のawk。上記onelinerで

awk '{for(i=1;i<=NF;i++) 
if($i~/foo="/){ split($i,x,"\""); x[2]=x[2]<100?x[2]+1000:x[2]; $i="foo=\""x[2]"\""; }}1' yourFile 

、基準は、あなたが望むようにあなたがのcriteriasを追加することができます<100. fooの属性値です。以下のような(x[2]>100 && x[2]<700)

+0

私は "fooがゼロよりも小さいかどうかをチェックする"と自分自身を引用しています...実際には、値がある範囲内にあるかどうかチェックする必要があります。 – powerbar

+0

@powerbarあなたは質問にあなたの要件を正しく記述するべきです。とにかく、あなたの新しいニーズ(範囲のもの)のために私の編集を参照してください – Kent

+0

awkのバージョンの作品はかなりいいようです! – powerbar

0

一つの方法は、perlを使用して):

infileの内容:

<!--Origin.txt--> 
<Tree> 
    <Node foo="600" bar="50" /> 
    <Node foo="-300" bar="600" /> 
</Tree> 

を実行し、次のコマンド:

perl -pe ' 
    s/\A(\s*<(?i:node)\s+(?i:foo)\s*=\s*")([^"]+)(")/$1 . (defined $2 && $2 < 0 ? $2 + 1000 : $2) . $3/e 
' infile 

そして結果:

<!--Origin.txt--> 
<Tree> 
    <Node foo="600" bar="50" /> 
    <Node foo="700" bar="600" /> 
</Tree> 
+0

私のリグにはPerlはインストールされていませんが、エレガントで短いソリューションです! – powerbar

0

TXRソリューション:

<[email protected]> 
<Tree> 
@(collect :gap 0) 
    <Node foo="@foo" bar="@bar" /> 
@ (set foo @(int-str foo)) 
@ (set foo @(if (< foo 0) (+ foo 1000) foo)) 
@(end) 
</Tree> 
@(output) 
<!--Output.txt--> 
<Tree> 
@ (repeat) 
    <Node foo="@foo" bar="@bar" /> 
@ (end) 
</Tree> 
@(end) 

ラン:ところで

$ txr xml.txr - 
<!--Origin.txt--> 
<Tree> 
    <Node foo="600" bar="50" /> 
    <Node foo="-300" bar="600" /> 
</Tree> 
[Ctrl-D][Enter] 
<!--Output.txt--> 
<Tree> 
    <Node foo="600" bar="50" /> 
    <Node foo="700" bar="600" /> 
</Tree> 
+0

私は以前はTXRを知らなかったが、余裕があったときにそれを調べるだろう!珍しい解決策を投稿してくれてありがとう! – powerbar

関連する問題