如何使用 sed 在文件开头附加存储在 shell 变量中的文本?

Wol*_*olf 5 bash sed variable

我在这里找到了有趣的讨论并尝试了给出的解决方案 sed

如何在文件开头插入文本?

/sf/answers/667361551/

它适用于普通文本,但不适用于将文本保存在变量中时。

wolf@linux:~$ cat file.txt 
1
2
3
wolf@linux:~$ 
Run Code Online (Sandbox Code Playgroud)

将文本 ( <added text>)添加到文件的开头

wolf@linux:~$ sed -i '1s/^/<added text>\n/' file.txt
wolf@linux:~$ 
Run Code Online (Sandbox Code Playgroud)

有用!

wolf@linux:~$ cat file.txt 
<added text>
1
2
3
wolf@linux:~$ 
Run Code Online (Sandbox Code Playgroud)

但是,当我用变量尝试它时,它不再起作用。

wolf@linux:~$ var='Text 1'
wolf@linux:~$ echo $var
Text 1
wolf@linux:~$ 

wolf@linux:~$ cat file.txt 
1
2
3
wolf@linux:~$ sed -i '1s/^/"$var"\n/' file.txt
wolf@linux:~$ cat file.txt 
"$var"
1
2
3
wolf@linux:~$ 
Run Code Online (Sandbox Code Playgroud)

而不是"$var",我如何调用$varinsed命令的实际值?我使用 GNU sed4.7:

sed (GNU sed) 4.7 Packaged by Debian
Copyright (C) 2018 Free Software Foundation, Inc.
Run Code Online (Sandbox Code Playgroud)

Adm*_*Bee 9

问题是您已按照建议将sed说明括在单引号中' ... '。但是,在单引号内,诸如$varis disabled 之类的变量扩展,表达式保持逐字不变。

作为解决方案,您可以将说明括在双引号中:

sed -i "1s/^/$var\n/" file.txt
Run Code Online (Sandbox Code Playgroud)

但是请注意,我建议为此使用“插入”命令:

sed -i "1i $var" file.txt
Run Code Online (Sandbox Code Playgroud)

将插入第$var1 行之前的内容。

编辑

正如@DigitalTrauma 在评论中正确指出的那样:如果您想保护“除变量之外的所有变量”以防止(不需要的)扩展,您可以使用带有混合引号的连接字符串参数,但这主要在s命令示例中有意义:

sed -i 's/^/'"$var"'\n/' file.txt
Run Code Online (Sandbox Code Playgroud)