我有一个名为“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
该脚本必须使用 busybox 小程序(awk、grep、sed、cat...)。
------------------------------------------
我首先尝试使用 echo 命令,但我得到: hello There is $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 注入漏洞)。
或者如果需要输出稍后执行的shell代码:
{
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";完毕
你好,这里是bibi.toto
你好,这里是 jaja.bubu
你好,有 vrtegbvtr.rvgtbtdtbvtd。
这是一个循环 for 的例子!
例2:
当读林哈时;做 echo "你好,有 $linha";完成 < 文件.txt
你好,这里是bibi.toto
你好,这里是 jaja.bubu
你好,这里有 vrtegbvtr.rvgtbtdtbvtd
所以它获取文件 file.txt 的每一行
答案4
感谢大家对我的帮助,特别是@Stéphane Chazelas 和@noob。我的问题可以结束了,Stéphane 的命令基本上可以工作,但是脚本必须工作的 shell 非常奇怪(EOF 问题)。
由于 noob 的第一个命令示例有点简单,所以它可以工作。我这样使用我的变量:
for i in $(cat $file1); do echo "text blabla $i blabla" >> $file2; done
再次感谢大家。