ファイルの値を変更する

ファイルの値を変更する

ファイルがあります:

$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 ','

おすすめ記事