다음 내용이 포함된 "file1.txt"라는 파일이 있습니다.
bibi.toto
jaja.bubu
vrtegbvtr.rvgtbtdtbvtd
다음과 같이 var 콘텐츠(file1.txt 줄 포함)로 일부 텍스트를 에코하고 싶습니다.
var=$(cat file1.txt)
echo 'hello there is $var' > final.sh
마침내 얻었습니다 :
final.sh content:
hello there is bibi.toto
hello there is jaja.bubu
hello there is vrtegbvtr.rvgtbtdtbvtd
스크립트는 비지박스 애플릿(awk, grep, sed, cat...)을 사용해야 합니다.
-----------------------------
처음에 echo 명령을 사용해 보았지만 다음과 같은 결과가 나왔습니다. hello 큰따옴표(")를 사용하더라도 {}가 아닌 $var가 있고 텍스트에 ' 및 "가 있기 때문에 큰따옴표를 사용하여 파일에 내용을 에코할 수 없습니다. 상징.
나는 또한 다음과 같이 sed를 사용해 보았습니다.
var=$(cat file1.txt)
final.sh content:
hello there is pattern
sed "s/pattern/$var/g" final.sh
그러나 나는 다음을 얻습니다: sed: unmatched '/' 내가 사용하는 경우: sed "s/pattern/\$var/g" Final.sh 나는 얻습니다: 안녕하세요, $var가 있습니다.
답변1
노력하다:
sed 's/^/hello there is /' file1.txt > final.sh
또는 변수를 사용해야 하는 경우:
printf '%s\n' "$var" | sed 's/^/hello there is /' > final.sh
빈 줄을 잃어도 괜찮다면 다음과 같이 할 수도 있습니다.
IFS='
' # split on newline
set -o noglob # disable glob
printf 'hello there is %s\n' $var > final.sh # invoke split+glob
실제 질문의 경우:
sed "s/.*/UPDATE ownership SET library_id = 'u-wl' where doc_id = '&';/" < file1.txt |
sqlite "$PLAY_DB_DIR/library.db"
(파일의 항목에 '
sqlite 또는 기타 특수 바이트 시퀀스가 포함되어 있지 않다고 가정합니다. 이를 보장할 수 없다면 기껏해야 sqlite 주입 취약점일 뿐입니다.)
또는 나중에 실행될 쉘 코드를 출력해야 하는 경우:
{
echo 'sqlite "$PLAY_DB_DIR/library.db" << "EOF"'
sed "s/.*/UPDATE ownership SET library_id = 'u-wl' where doc_id = '&';/" < file1.txt
echo EOF
} > final.sh
귀하의 샘플은 다음을 제공합니다.
sqlite "$PLAY_DB_DIR/library.db" << "EOF"
UPDATE ownership SET library_id = 'u-wl' where doc_id = 'bibi.toto';
UPDATE ownership SET library_id = 'u-wl' where doc_id = 'jaja.bubu';
UPDATE ownership SET library_id = 'u-wl' where doc_id = 'vrtegbvtr.rvgtbtdtbvtd';
EOF
아니면 당신이가지다쿼리당 하나의 명령을 실행합니다 sqlite
.
repl=$(cat << "EOF"
sqlite "$PLAY_DB_DIR/library.db" 'UPDATE ownership SET library_id = '\\''u-wl'\\'' where doc_id = '\\''&'\\'';'
EOF
)
sed "s@.*@$repl@" < file1.txt > final.sh
(이번에는 sqlite 주입 취약점에 더해 파일에 작은따옴표 문자가 포함될 수 있는 경우 임의 명령 실행 취약점이 됩니다.)
샘플에서 다음을 제공합니다.
sqlite "$PLAY_DB_DIR/library.db" 'UPDATE ownership SET library_id = '\''u-wl'\'' where doc_id = '\''bibi.toto'\'';'
sqlite "$PLAY_DB_DIR/library.db" 'UPDATE ownership SET library_id = '\''u-wl'\'' where doc_id = '\''jaja.bubu'\'';'
sqlite "$PLAY_DB_DIR/library.db" 'UPDATE ownership SET library_id = '\''u-wl'\'' where doc_id = '\''vrtegbvtr.rvgtbtdtbvtd'\'';'
답변2
어때요?
$ readarray -t X <file
$ IFS=$'\n'
$ echo "${X[*]/#/hello there is }"
hello there is bibi.toto
hello there is jaja.bubu
hello there is vrtegbvtr.rvgtbtdtbvtd
답변3
예 1:
for i in $(cat file.txt); echo "안녕하세요, $i가 완료되었습니다."
안녕하세요 비비토토 입니다
안녕하세요 jaja.bubu 입니다
안녕하세요 vrtegbvtr.rvgtbtdtbvtd 입니다.
이것은 for! 루프의 예입니다.
예 2:
Linha를 읽을 때 echo "안녕하세요, $linha가 있습니다." < file.txt
안녕하세요 비비토토 입니다
안녕하세요 jaja.bubu 입니다
안녕하세요 vrtegbvtr.rvgtbtdtbvtd 입니다
따라서 file.txt 파일의 각 줄을 가져옵니다.
답변4
도와주신 모든 분들께 감사드립니다. 특히 @Stéphane Chazelas와 @noob에게 감사드립니다. 내 문제는 Stéphane의 명령이 기본적으로 작동하지만 스크립트가 작동해야 하는 셸이 매우 이상하다는 결론을 내릴 수 있습니다(EOF 문제).
멍청한 놈의 첫 번째 명령 예제는 약간 간단하기 때문에 작동합니다. 나는 다음과 같이 변수를 사용합니다.
for i in $(cat $file1); do echo "text blabla $i blabla" >> $file2; done
다시 한번 감사드립니다.