Bashを使用したxmlファイルの追加

Bashを使用したxmlファイルの追加

フォーラムの良い人がこのスクリプトを作成するのを手伝ってくれましたが、私が投げたものはすべてエラーを出力し、なぜ問題が何であるのかわかりません。 bash test.shをリクエストすると、Ubuntu端末ですべてのスクリプトを実行しました。

私の目標は、複数の.xmlファイルにタグを追加することですが、process></process>一部のファイルには1〜100個のタグがあります。

例:

 - jfksaJDFH
 - <process>value=""</process>
 - <process>value=""</process>
 - <process>value=""</process>
 - <process>value=""</process>
 - jdhkjasdh
 - <process>value=""</process>
 - <process>value=""</process>
 - <process>value=""</process>
 - <process>value=""</process>

スクリプト以降:

 - jfksaJDFH
 - <process>value="1"</process>
 - <process>value="2"</process>
 - <process>value="3"</process>
 - <process>value="4"</process>
 - jdhkjasdh
 - <process>value="5"</process>
 - <process>value="6"</process>
 - <process>value="7"</process>
 - <process>value="8"</process>

スクリプト:

#!/bin/bash

dir="/mnt/Desktop/test/"

while IFS= read -r -d '' file
do
    i=1
    while IFS= read -r -u 3 line
    do
        if [[ $line = '<process></process>' ]]; then
           echo "<process>value=\"$((i++))\"</process>"
        else
           echo "$line"
        fi
    done 3< "$file" > "$file.xml"
done < <(find $dir -type f -name \*.xml -print0)

上記のスクリプトが実行されたら、最後のスクリプトを削除します。<process>value=""</process>

スクリプトを次のように変更します。

while IFS= read -r -d '' file
do
    i=1
    while IFS= read -r -u 3 line
    do
        if [[ $line = '<process></process>' ]]; then
           echo "$line"
        else
           echo "<process>value=\"$((i++))\"</process>"
        fi
    done 3< "$file" > "$file.xml"
done < <(find $dir -type f -name \*.xml -print0)

ファイルの出力は次のとおりです。

<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>
<process>value="11"</process>
<process>value="12"</process>
<process>value="13"</process>
<process>value="14"</process>
<process>value="15"</process>
<process>value="16"</process>
<process>value="17"</process>
<process>value="18"</process>
<process>value="19"</process>
<process>value="20"</process>
<process>value="21"</process>
<process>value="22"</process>
<process>value="23"</process>

つまり、これはページ内の他のすべてのエントリを追加しますが削除します。

ベストアンサー1

このスクリプトをファイルに入れます(例: 'increase.awk'):

BEGIN { i = 1 }
/.*<process>value=""<\/process>.*/ { split($0, a, "value=\"\"") ; print a[1] "value=\"" i++ "\"" a[2] ; next }
/.*/ { print $0 }

それから電話してください。

gawk -f increase.awk < yourinputfile

説明:awkでは、split("string", a, "separatorstring")「separatorstring」を区切り文字として使用して、「string」をaという配列に分割します。したがって、a[1]には最初の「区切り文字列」までのすべての内容が含まれ、a[2]には行末または次の「区切り文字列」までのすべての内容が含まれます。

おすすめ記事