다음과 같은 파일이 있습니다 input.txt
.
$cat input.txt
This is sample
Input file
To execute sql statement
아래와 같은 출력을 변수에 할당해야 합니다.
X=('This is sample', 'Input file', 'To execute sql statement')
이렇게 하면 위의 문자열 X를 조건의 SQL 쿼리에 대한 입력으로 사용할 수 있습니다 IN
.
select * from table where columnname in X
여기서 나를 도와주세요.
답변1
그리고 bash
:
mapfile -t a < input.txt # read input file into array a
printf -v x "'%s'," "${a[@]}" # add single quotes and commas, save result in variable x
printf -v query 'select * from table where columnname in (%s);' "${x:0:-1}" # strip the last comma from x
printf '%s\n' "$query" # print query
산출:
select * from table where columnname in ('This is sample','Input file','To execute sql statement');
답변2
파일을 한 줄씩 배열로 분할합니다.
# Tell bash that "lines" is an array
declare -a lines
# Read each line of the file
while read line; do
lines+=("$line")
done <input.txt
결과를 인쇄합니다:
# Show the first line
echo "${lines[0]}"
# Show all lines
echo "${lines[@]}"
대부분의 데이터베이스 CLI 도구를 사용하면 파일을 입력으로 실행할 수 있습니다. 포스트그레스의 예:
psql -f input.txt
답변3
짧막 한 농담:
IFS=$'\n'; (read -r L && echo -n "X=('${L//\'/\"}'"; while read -r L; do echo -n ",'${L//\'/\"}'"; done; echo ")";) < input.txt; IFS=' '
(안의 모든 작은따옴표 기호는 '
큰따옴표 기호로 대체됩니다 "
.)
산출:
X=('This is sample','Input file','To execute sql statement')
또는 변수에 할당합니다.
$ IFS=$'\n'; X=$( (read -r L && echo -n "('${L//\'/\"}'"; while read -r L; do echo -n ",'${L//\'/\"}'"; done; echo ")";) < input.txt); IFS=' ';
$ echo $X
('This is sample','Input file','To execute sql statement')
고쳐 쓰다.첫 번째 라이너는 다음과 같이 설명했습니다.
#
# redefining IFS to read line by line ignoring spaces and tabs
# you can read more about at
# https://unix.stackexchange.com/questions/184863/what-is-the-meaning-of-ifs-n-in-bash-scripting
#
IFS=$'\n';
#
# next actions united inside of round brackets
# to read data from input.txt file
#
# first line from the file read separately,
# because should be printed with opening brackets
#
# between read and echo we use && to make sure
# that data are printed only if reading succeeded
# (that means that the file is not empty and we have reading permissions)
#
# also we print not just "X=($L
# but variable modified in the way to replace ' with "
# more details about it you can find at
# https://devhints.io/bash in Substitution section
# also quotes symbols inside of quoted text are backslash'ed
#
(read -r L && echo -n "X=('${L//\'/\"}'";
#
# now we read lines one by one as long as reading returns data
# (which is until we reach end of file)
# and each time printing: ,'LINE-DATA'
# I mean coma and data in single quotes like requested
# where the data are the lines where single quotes replaced
# with double quotes, the same as we did for the first line
while read -r L; do
echo -n ",'${L//\'/\"}'";
done;
#
# finally we print closing brackets for the data from file
#
# also we close round brackets uniting actions to read data from file
# and specifying file name from where we read data
echo ")";) < input.txt;
#
# at the end we change IFS back to original.
# actually for 100% accuracy it should be IFS=$' \t\n'
IFS=' '
답변4
이식 가능한 셸 함수만 사용하세요.
oIFS=$IFS # Store the IFS for later;
IFS= # Empty the IFS, to ensure blanks at the
# beginning/end of lines are preserved
while read -r line; do # Read the file line by line in a loop,
set -- "$@" "'""$line""'" # adding each line to the array of positional
done < input # parameters, flanked by single quotes
IFS=, # Set "," as the first character of IFS, which
# is used to separate elements of the array
# of positional parameters when expanded as
# "$*" (within double quotes)
X=\("$*"\) # Add parentheses while assigning to "X"
IFS=$oIFS # Restore the IFS - to avoid polluting later
# commands' environment
이용시 참고해주세요텍스트 처리를 위한 셸 루프 문제, 그러나 여기서는 파일 내용이 쉘 변수로 끝나기를 원하기 때문에 이것이 의미가 있을 수 있습니다.
산출:
$ printf "%s %s\n" 'select * from table where columnname in' "$X"
select * from table where columnname in ('This is sample','Input file','To execute sql statement')
또는 다음과 같은 것을 사용할 수 있습니다 sed
. 이 스크립트는 각 입력 줄에 작은따옴표를 추가하고 모든 줄을 예약된 공간에 추가하고 마지막 줄을 추가한 후 예약된 공간의 내용을 패턴 공간에 넣고 <newline>
모든 항목을 쉼표로 바꿉니다. , 텍스트의 시작/끝에 대괄호를 추가하고 전체 내용을 인쇄합니다.
X=$(sed -n '
s/^/'"'"'/
s/$/'"'"'/
H
1h
${
g
s/\n/,/g
s/^/(/
s/$/)/
p
}
' input)
물론 이러한 메서드는 입력 줄에 나타날 수 있는 작은따옴표를 처리하지 않으며 이로 인해 결국 SQL 문이 손상되거나 최소한 예상한 결과가 생성되지 않습니다.