sedとループを使用してファイルを引数として渡す

sedとループを使用してファイルを引数として渡す

ここで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"

関連情報