ここでFile1はテンプレートです。ファイル2は、スクリプト名、ジョブ名、テンプレート名、場所の列を含む200行のcsvです
。テンプレート名はファイル 2 の列です。
次のようにすればいいですか?目的は、file2の他の行に対して(file1の)異なるテンプレートを使用することです。
フライ2行で$templatenameを変更したいのですが、助けてくれてありがとう。可能ですか?以下は機能しません:
- サンプルファイル1
scriptname
statments go here
change jobname
場所フォルダに保存(既に存在)
- サンプルファイル2
scriptname, jobname, templatename, location
qqqtest,sew-test,/san00/test/file1, /san00/test/
qqqtest,sew-test,/san00/test/file2, /san00/test/
csvを読み、次の更新を実行して毎回file1、file2テンプレートなどを変更したいですか?
while IFS=, read scriptname jobname templatename location;
do sed -e "s/scriptname/$scriptname/" \
-e "s/jobname/$jobname/" $templatename > "$location"
done < (file2)
$templatenameを更新する方法は?
答え1
何が欲しいのかわかりません。しかし、修正する必要があるいくつかのことがわかります。
IFS=, read scriptname jobname templatename location
カンマで区切られた値を読み取ります。では、file2
カンマの周囲にスペースがある場合があります。スペースは変数で終わります。フィールドにスペースがない場合は、オプションのスペースでIFS=', '
囲まれたカンマシーケンスまたはスペースシーケンスを区切り文字として扱うように設定します。フィールド内にスペースがある場合がありますが、先頭または末尾にスペースがない場合は、file2
最初に前処理することをお勧めします。
<file2 sed -e 's/^ *//' -e 's/ *, */,/g' -e 's/ *$//' | while IFS=, read …; do …; done
ただし<(file2)
、一部のシェルでは構文エラーですが、他のシェルではこれがfile2
実行されるコマンド(プロセス置換)であることを意味します。はい、意味は<file2
。
/
スクリプト名またはジョブ名が存在する場合は、sed
コマンドに含まれており、sed構文エラーが発生します。で生成されたフィールドにはカンマを使用できません。sedコマンド区切り文字をfile2
使用してください。,
s
sed -e "s,scriptname,$scriptname," -e 's,jobname,$jobname,' …
サンプルデータの場所はディレクトリですが、コードではここに出力を書き込もうとします。場所がディレクトリの場合は、ファイル名が必要です。$templatename
場所がディレクトリの場合と同じファイル名を使用するには、次のようにします。
if [ -d "$location" ]; then
location="$location/${templatename##*/}"
fi
これらのファイルは$location
同じ$templatename
ファイルにすることはできません。それ以外の場合、sed … "$templatename" >"$location"
ファイルは最初に切り捨てられ、次にそのファイルから読み始めます。ファイルが同じである可能性を許可するには、sed出力を一時ファイルに書き込み、その場所に移動します。あなたが持っている場合mkstemp
:
location_dir=${location%/*}
tmp=$(TMPDIR=$location_dir mktemp -t)
sed … >"$tmp"
mv -f -- "$tmp" "$location"