「|」があります 区切りテキスト ファイル。2 つのフィールドを結合し、これを同じレコード内の別のフィールド ($5) によって指定された xml ファイルに挿入する必要があります。
awk -F "|" '{print $2$4 >> $5 }' source.txt
これは素晴らしいことですが、ファイルの最後にデータを追加するだけです。<element> blablabla </element>
各xmlにあるコンテンツを置き換えるために必要です。
前もって感謝します
私の理解が正しければ、別のファイルから推定したデータを使用して、各 XML ファイルをその場で変更する必要があります。たとえば、ソース データは次のようになります。
one|fluffy|slurm|unicorns|animal.xml
two|yellow|flarn|moons|mineral.xml
three|blue|jalaroot|stars|mineral.xml
XML ... まあ、例を挙げる必要はありません。<element>
各 XML ファイルの を $2 と $4 を連結したものに置き換えたいと考えています。これが正しくない場合は、質問で明確にしてください。
ここにオプションがあります。
#!/bin/sh
awk -F'|' '{print $5,$2$4}' source.txt | while read file data; do
case "$data" in
*#*) echo "ERROR: invalid data ('$data')" >&2 ;;
*) if [ -f "$file" ]; then
sed -ri -e "s#<element>[^>]+</element>#<element>$data</element>#" "$file"
else
echo "ERROR: no such file: '$file'" >&2
fi
;;
esac
done
ここでの考え方は、データをシェル変数のセットとして取得し$file
、$data
その後、while ループで各置換をステップ実行するというものです。置換は、sed
「インプレース」(-i) を使用して行われます。これを使用する前に、実装のマニュアル ページを読み、sed
データをバックアップしてください。
これは実際には POSIX 互換であり、bash を必要としないことに注意してください。(ただし、bash でも問題なく動作します。)
条件:
これを試すことができますbash
:
#!/bin/bash
while read line
do
arr=(${line//|/ })
sed -i.bak "s#<element>.*</element>#<element>${arr[1]}${arr[3]}</element>#g" ${arr[4]}
done < 'source.txt'
テスト :
sat:~# cat source.txt
projectName|URL|string1|string2|file.xml
projectName|URL|hello1|hello2|sample.xml
sat:~#
sat:~# cat file.xml
<element>xmlcontent</element>
sat:~#
sat:~# cat sample.xml
<element> content </element>
sat:~#
sat:~# bash sample.sh # Executing script
sat:~#
sat:~# cat file.xml
<element>URLstring2</element>
sat:~#
sat:~# cat sample.xml
<element>URLhello2</element>
サンプルの入力または期待される出力を提供しなかったため、テストされていませんが、これは必要なものに近いはずです。
awk -v pid="$$" '
NR==FNR {
file = $5
f2s[file,++numSubs[file]] = $2 $4
if ( !seen[file]++ )
ARGV[ARGC++] = file
next
}
{
for (i=1; i <= numSubs[FILENAME]; i++)
gsub(/<element>.*<\/element>/,"<element>" f2s[FILENAME,i] "</element>")
print > (FILENAME ".mod_" pid)
}
' source.txt
for f in *.mod_$$
do
mv -- "$f" "${f%.mod_$$}"
done
上記が何をしているのかを考えて、実際のファイルで実行する前に、ファイルのコピーでテストしてください。それはテストされていません。