Bash

如何使用 sed 在文件開頭附加儲存在 shell 變數中的文本?

  • January 25, 2021

我在這裡找到了有趣的討論並嘗試了給出的解決方案sed

如何在文件開頭插入文本?

https://stackoverflow.com/a/9533736/13353532

它適用於普通文本,但不適用於將文本保存在變數中時。

wolf@linux:~$ cat file.txt 
1
2
3
wolf@linux:~$ 

將文本 ( <added text>) 添加到文件的開頭

wolf@linux:~$ sed -i '1s/^/<added text>\n/' file.txt
wolf@linux:~$ 

有用!

wolf@linux:~$ cat file.txt 
<added text>
1
2
3
wolf@linux:~$ 

但是,當我嘗試使用變數時,它不再起作用。

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:~$ 

而不是"$var",我如何呼叫$varinsed命令的實際值?我使用 GNU sed4.7:

sed (GNU sed) 4.7 Packaged by Debian
Copyright (C) 2018 Free Software Foundation, Inc.

問題是您已按照建議將sed說明用單引號括起來' ... '。但是,在單引號內,變數擴展如$varis disabled,並且表達式保持原樣。

作為一種解決方案,您可以將說明用雙引號括起來:

sed -i "1s/^/$var\n/" file.txt

但是請注意,我建議為此使用“插入”命令:

sed -i "1i $var" file.txt

將插入第$var1 行之前的內容。

編輯

s正如@DigitalTrauma 在評論中正確指出的那樣:如果您想保護“除變數之外的所有內容”以防止(不需要的)擴展,您可以使用帶有混合引號的連接字元串參數,但這在命令範例中主要是有意義的:

sed -i 's/^/'"$var"'\n/' file.txt

引用自:https://unix.stackexchange.com/questions/627578