23

.xml ファイルの変数をインクリメントしようとして行き詰まりました。タグはファイル内に 100 回または 2 回だけ存在する可能性があります。量を数回増やす値を追加しようとしています。作業中のサンプル コードをいくつか含めましたが、スクリプトを実行すると、1 つだけ配置され、それ以上インクリメントされません。私が間違っていることについてのアドバイスは素晴らしいでしょう。

for xmlfile in $(find $DIRECTORY -type f -name \*.xml); do
  TFILE="/tmp/$directoryname.$$"
  FROM='><process>'
  TO=' value\=""><process>'
  i=0
  while [ $i -lt 10 ]; do
    i=`expr $i + 1`
    FROM='value\=""'
    TO='value\="'$i'"'
  done
  sed "s/$FROM/$TO/g" "$xmlfile" > $TFILE && mv $TFILE "$xmlfile"
done

ループは、whileコードをテストするために配置したものです。を挿入<process>しますが、インクリメントは挿入しません。

私の最終目標:

<process>value="1"</process>
<process>value="2"</process>
<process>value="3"</process>
<process>value="4"</process>

など、ファイルに存在する限り、<process>インクリメントする必要があります。

4

5 に答える 5

33

コードをテストしたところ、正しくインクリメントされているようiです。

インクリメント構文を次のように変更してみてください。

i=`expr $i + 1`

i=$((i+1))
于 2012-11-14T19:54:04.467 に答える
20

を適切にインクリメントするbashには、for ループ (C スタイル) を使用します。

n=10
for ((i=1; i<=n; i++)) {
    printf '<process>value="%d"</process>\n' $i
}

出力

<process>value="1"</process>
<process>value="2"</process>
<process>value="3"</process>
<process>value="4"</process>
<process>value="5"</process>
<process>value="6"</process>
<process>value="7"</process>
<process>value="8"</process>
<process>value="9"</process>
<process>value="10"</process>

ノート

exprは、数学を行うために古代のシェル コードで使用されるプログラムです。bash などの Posix シェルでは、$(( expression )) を使用します。bash と ksh93 では、展開で結果を使用する必要がない場合は(( expression ))orも使用できます。let expression

編集

私があなたのニーズを誤解していて、次のような空白の値を持つファイルがある場合:

<process>value=""</process>

これを試して :

$ perl -i -pe '$c++; s/<process>value=""/<process>value"$c"/g' file.xml
<process>value"1"</process>
<process>value"2"</process>
<process>value"3"</process>
<process>value"4"</process>
<process>value"5"</process>
<process>value"6"</process>
<process>value"7"</process>

-i実際にファイルを切り替えて編集するので、注意してください。

于 2012-11-14T21:30:55.467 に答える
1

使用awk:

awk '{gsub( "value=\"\"", "value=" i++ ); print }' i=1 input-file

value=""これにより、文字列がvalue="1"、などに置き換えvalue="2"られます。開始値と増分は簡単に変更できます (例: ..."value=" i ); i+=5; print)

于 2012-11-14T20:22:11.540 に答える