BASH-如何读取文件内容以将结果插入mysql WHERE子句
我试图创建一个文件(称之为accounts)并让一个bash脚本(称之为*name\u checker*)在每一行中循环,并将其生成多个字符串,以存储在mysql WHERE in子句中名为“$NAMES”的变量中 例如: 我的脚本*name\u checker*中的查询是基本查询: 从帐户名称所在的表(“$NAMES”)中选择* IN语句的值需要用逗号分隔,并用单引号引起来 我的帐户文件将以换行符分隔名称: NAME1 NAME2 NAME3 所以我需要我的脚本(*name_checker*)来去掉换行符,用单引号将每个名称括起来,并用逗号分隔。运行脚本时,所需的结果如下 从帐户名称所在的表中选择*('NAME1'、'NAME2'、'NAME3') 我在这方面遇到了一些困难,我对使用sed不太熟悉。谢谢你的帮助BASH-如何读取文件内容以将结果插入mysql WHERE子句,mysql,bash,variables,Mysql,Bash,Variables,我试图创建一个文件(称之为accounts)并让一个bash脚本(称之为*name\u checker*)在每一行中循环,并将其生成多个字符串,以存储在mysql WHERE in子句中名为“$NAMES”的变量中 例如: 我的脚本*name\u checker*中的查询是基本查询: 从帐户名称所在的表(“$NAMES”)中选择* IN语句的值需要用逗号分隔,并用单引号引起来 我的帐户文件将以换行符分隔名称: NAME1 NAME2 NAME3 所以我需要我的脚本(*name_checker*)
names=“”$(cat | sed's/(\w)\n(\w)/\1\,\'\2/g)“
试试看
:D尝试将其放入查询中:
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'
你也可以试试这个 Accounts.txt
NAME1
NAME2
NAME3
'NAME1','NAME2','NAME3'
代码
NAME=`awk '{print "-"$0"-"}' Accounts.txt| tr "-" "'" | tr '\n' ',' | sed 's/.$//g'`
echo "$NAME"
输出
NAME1
NAME2
NAME3
'NAME1','NAME2','NAME3'
注意-
在SQL代码中使用变量$NAME。这将把换行符分隔的条目转换为单引号、逗号分隔的条目
var=$(awk '{print "\x27"$0"\x27"}' ORS=, accounts_file)
var="${var%,}"
注:
ORS
表示输出记录分隔符。它基本上是用来终止awk输出的每一行的字符(默认值:换行符)\x27
是单引号的十六进制代码,以避免与外部单引号对冲突(因为单引号内不能有任何转义序列)${var%,}
是一个删除尾部逗号的命令,因为awk
命令会给您留下一个额外的逗号如果使用的是
bash
4或更高版本,则可以使用mapfile
命令(也拼写为readarray
)将整个文件拉入单个数组。然后,可以将数组扩展为逗号分隔的用户名的单个字符串
$ mapfile users < Accounts.txt
$ quotedUsers=( $( printf "'%s' " ${users[@]%?} ) )
$ userString=$( IFS=,; echo "${quotedUsers[*]}" )
$mapfile users
无需调用外部实用程序即可完成此操作
cat >Accounts.txt <<XXX
NAME1
NAME2
NAME3
XXX
或者它甚至可以简化为删除显式循环
printf -v NAMES ",'%s'" $(<Accounts.txt)
NAMES=${NAMES:1}
echo "$NAMES";
我试过了,但在寻找匹配的```语法错误时,我得到了意外的EOF:文件的意外结尾试图使用结束引号,但我找不到需要的内容
sed(1)
可以直接读取文件。不需要为猫(1)使用另一个进程。嘿,对不起,我忘了跳过第二个单引号:P我在上一次发布时可能有点神经过敏^ ^你应该学会如何使用sed-tho,man-sed
!$NAMES变量将被定向到另一个名为“accounts”的文件。很抱歉,作为示例,我几乎复制了我的shell。将文件直接传递给sed-例如sed-e“s/\([a-zA-Z]*\)/'\1',/g“-e's/,$/'帐户
-这应该能满足您的需要。mapfile
比使用ARR=($(mapfile
作为一些其他选项更好,可以让您在读取每X行后调用回调函数(老实说,我从来没有完全弄清楚如何使用)。如果shell可以将任何一行拆分为多个单词,那么使用命令替换将无法给出预期的结果。printf-v quotedUsers''%s'“${users[@]]?}”
就可以了,我相信(我忘了这个选项)ne.如果你的答案中包含了这一点,那么我认为没有理由修改我的答案来复制你已经拥有的。有很多方法可以完成这项任务;这只是其中一种。^^^^^很好!我特别喜欢这个结构$(IMHO使用4个外部实用程序有点过分。它可以在纯awk中完成。或者,我认为,在纯awk中完成。祝大家好运。
'NAME1','NAME2','NAME3'