5

我正在尝试创建一个文件(称为帐户)并有一个 bash 脚本(称为 *name_checker*)循环遍历每一行并将其转换为多个字符串以存储在一个名为 ' $NAMES ' 的变量中,用于 mysql WHERE IN条款

例如:

我在脚本 *name_checker* 中的查询是基本的:

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

IN 语句的值需要用逗号分隔并放在单引号中。

我的帐户文件将是由换行符分隔的名称:

NAME1

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)将整个文件拉入单个数组。然后,您可以将数组扩展为一个以逗号分隔的用户名字符串。

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

你也可以试试这个。。

帐户.txt

NAME1
NAME2
NAME3

代码

NAME=`awk '{print "-"$0"-"}' Accounts.txt| tr "-" "'" | tr '\n' ',' | sed 's/.$//g'`
echo "$NAME"

输出

'NAME1','NAME2','NAME3'

注意 - 在 SQL 代码中使用变量 $NAME。

于 2013-06-08T19:09:14.610 回答
1

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

试试看?

:D

于 2013-06-08T18:37:12.017 回答
1

尝试将其放入您的查询中:

echo $NAMES | sed -e "s/\([a-zA-Z]*\)/'\1',/g" -e 's/,$//';

例子:

$ NAMES='Martin John Barbera Holly'
$ echo $NAMES | sed -e "s/\([a-zA-Z]*\)/'\1',/g" -e 's/,$//';
'Martin', 'John', 'Barbera', 'Holly'
于 2013-06-08T18:43:50.920 回答
1

这会将换行符分隔的条目转换为单引号、逗号分隔的条目。

var=$(awk '{print "\x27"$0"\x27"}' ORS=, accounts_file)
var="${var%,}"

笔记:

  1. ORS代表输出记录分隔符。它基本上是用于终止 awk 输出的每一行的字符(默认值:换行符)
  2. \x27是单引号的十六进制代码,避免与外面的一对单引号发生冲突(因为单引号内不能有任何转义序列)
  3. ${var%,}是一个参数扩展,它删除尾随逗号,因为该awk命令会给您留下一个额外的逗号。
于 2013-06-08T20:51:31.860 回答