5

私はファイルを作成しようとしており ( accountsと呼びます)、bash スクリプト ( *name_checker* と呼びます) を各行にループさせ、それを複数の文字列にして、mysql WHERE IN の' $NAMES ' という変数に格納しようとしています。句

例えば:

私のスクリプト *name_checker* のクエリは基本的なものです:

SELECT * FROM table WHERE account_name IN ('$NAMES')

IN ステートメントの値は、コンマで区切り、一重引用符で囲む必要があります。

アカウントファイルは、改行で区切られた名前になります

名前1

NAME2

NAME3

したがって、改行を取り除き、各名前を一重引用符で囲み、カンマで区切るには、スクリプト (*name_checker*) が必要です。スクリプトが実行されたときの望ましい結果は次のようになります

SELECT * FROM table WHERE account_name IN ('NAME1','NAME2','NAME3')

私はこれに苦労しており、sedの使用にあまり慣れていません。助けていただければ幸いです。

4

6 に答える 6

8

外部ユーティリティを呼び出さずに実行できます。

cat >Accounts.txt <<XXX
NAME1
NAME2
NAME3
XXX

脚本:

while read x; do NAMES="$NAMES,'$x'"; done <Accounts.txt
NAMES=${NAMES:1}
SQL='SELECT * FROM table WHERE account_name IN ('$NAMES')'
echo "$SQL"

出力:

SELECT * FROM table WHERE account_name IN ('NAME1','NAME2','NAME3')

または、明示的なループを削除して単純化することもできます

printf -v NAMES ",'%s'" $(<Accounts.txt)
NAMES=${NAMES:1}
echo "$NAMES";

出力:

'NAME1','NAME2','NAME3'
于 2013-06-08T21:52:53.190 に答える
4

bash4 以降を使用している場合は、mapfileコマンド (スペルもreadarray) を使用して、ファイル全体を 1 つの配列にプルできます。次に、配列をカンマ区切りのユーザー名の単一文字列に展開できます。

$ mapfile users < Accounts.txt
$ quotedUsers=( $( printf "'%s' " ${users[@]%?} ) )
$ userString=$( IFS=,; echo "${quotedUsers[*]}" )
于 2013-06-08T21:46:17.027 に答える
1

names="'$(cat <your file> | sed 's/(\w)\n(\w)/\1\', \'\2/g)'"

やってみる?

:D

于 2013-06-08T18:37:12.017 に答える