echo line with var 包含几行

echo line with var 包含几行

我有一个名为“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

再次感谢大家。

相关内容