私のスクリプトに問題があります。
全奏曲 まず、次の100行のファイルのリストがあります。
100;TEST ONE
101;TEST TWO
...
200;TEST HUNDRED
各行には2つのパラメータがあります。たとえば、最初の行のパラメータは「645」、「TEST ONE」です。したがって、セミコロンは区切り記号です。
2つの変数に2つのパラメータを含める必要があります。 $idと$nameだとしましょう。 $ idと$ nameの値は行ごとに異なります。たとえば、2行目の場合は、$ id = "646"と$ name = "TEST TWO"です。
その後、サンプルファイルをインポートして、事前定義されたキーワードを$ idと$ nameの値に変更する必要があります。サンプルファイルは次のとおりです。
xxx is yyy
だから私は異なる内容の100ファイルが欲しいです。各ファイルには、各行の$ idおよび$ nameデータを含める必要があります。そして$ nameの値に名前を付ける必要があります。
私のスクリプトがあります。
#!/bin/bash -x
rm -f output/*
for i in $(cat list)
do
id="$(printf "$i" | awk -F ';' '{print $1}')"
name="$(printf "$i" | awk -F ';' '{print $2}')"
cp sample.xml output/input.tmp
sed -i -e "s/xxx/$id/g" output/input.tmp
sed -i -e "s/yyy/$name/g" output/input.tmp
mv output/input.tmp output/$name.xml
done
だから私はリストファイルを一行ずつ読みました。各行に2つの変数をインポートし、それを使用してサンプルファイルのキーワード(xxxとyyy)を置き換え、結果を保存します。
しかし、何かが間違っています。
その結果、出力ファイルは1つだけです。そしてデバッグがひどいようです。
これはデバッグウィンドウです。私のリストファイルには2行しかありません。出力ファイルのみを取得します。ファイル名は「TEST」で、「101 is TEST」という文字列が含まれます。
「Test One」と「Test Two」の2つのファイルが必要です。「100はTest One」と「101はTest Two」を含める必要があります。
ご覧のとおり、2番目の変数(「TEST ONE」など)にスペースがあります。問題が空白の特殊記号に関連しているようですが、理由がわかりません。 -F awkパラメーターを ";"に設定したため、awkはセミコロンのみの区切り文字として解釈する必要があります。
私は何が間違っていましたか?
ベストアンサー1
私が正しく理解したら、whileループと変数拡張を使用できます。
while IFS= read -r line; do
id="${line%;*}"
name="${line#*;}"
cp sample.xml output/input.tmp
sed -i -e "s/xxx/$id/g" output/input.tmp
sed -i -e "s/yyy/$name/g" output/input.tmp
mv output/input.tmp output/"$name".xml
done < file
@steeldriverが提案したように、ここに(よりエレガントな)オプションがあります:
while IFS=';' read -r id name; do
cp sample.xml output/input.tmp
sed -i -e "s/xxx/$id/g" output/input.tmp
sed -i -e "s/yyy/$name/g" output/input.tmp
mv output/input.tmp output/"$name".xml
done < file