ファイルがあります:
$cat file1.txt
1234|W
1345|S
8427|D
2132|C
3243|V
私のSQLファイルは次のとおりです
$cat select.sql
SELECT *
FROM CUSTOMERS
WHERE ID IN (FLAG);
次のガイドラインを含むシェルがあります。
$cat replace.ksh
!#/bin/ksh
S_ids=`awk -F"|" '{print "\47" $1 "\47" ","}' file1.txt |sed '$s/,$//'`
sed -i "s/FLAG/${S_ids}/g" select.sql
FLAGという単語のファイル入力に変数 "S_ids"の値を入れる必要があります。select.sql
結果は次のようになります。
$cat select.sql
SELECT *
FROM CUSTOMERS
WHERE ID IN ('1234',
'1345',
'8427',
'2132',
'3243');
私はこれを試しましたが、sed -i "s/FLAG/${S_ids}/g" select.sql
期待した結果が得られませんでした。
ベストアンサー1
これがうまくいかない理由は、(提供を省略した)エラーメッセージから推論できます。
sed: -e expression #1, char 14: unterminated `s' command
このsed
コマンドは複数行の値を受け入れません。複数の行を1つに縮小する必要があります。次のスクリプトを使用してこれを実行できます。
#!/bin/ksh
S_ids="'$(cut -d'|' -f1 file1.txt | tr '\n' ' ' | sed -e 's/ *$//' -e "s/ /','/g")'"
sed -i "s/FLAG/${S_ids}/g" select.sql
S_ids
生成方法を確認するには、パイプラインの各部分をインポートするだけです。
cut -d'|' -f1 file.txt # Extract first column
tr '\n' ' ' # Convert newlines to spaces
sed -e 's/ *$//' # Strip the trailing space
sed -e "s/ /','/g" # Replace each remaining space with the three characters ','