我有一个看起来像这样的文件:
ABC
DEF
GHI
我有一个看起来像这样的shell变量:
var="MRD"
我想做的是让我的文件看起来像这样:
ABC
MRD
DEF
GHI
我试图这样做:
sed -i -e 's/ABC/&$var/g' text.txt
但它只插入$ var而不是值。我也试过这个:
sed -i -e 's/ABC/&"$var"/g' text.txt
但这也不起作用。有什么想法吗?
谢谢!
答案 0 :(得分:3)
看看是否有效。
var="MRD"
sed 's/ABC/&\n'"${var}"'/' text.txt
修改强>
我们可以使用任何字符代替/。因此,如果我们希望它在搜索或替换表达式中,请使用|
var="</stuff>"
sed 's|ABC|&\n'"${var}"'|' text.txt
答案 1 :(得分:2)
答案 2 :(得分:1)
var='<stuff>' awk '{ print $0 } NR==1 { print ENVIRON["var"]; }' \
<<<$'ABC\nDEF\nGHI' \
产量
ABC
<stuff>
DEF
GHI
进行就地替换:
tempfile=$(mktemp "${infile}.XXXXXX")
awk ... <"$infile" >"$tempfile" \
&& mv "$tempfile" "$infile"
请注意var
需要在环境中 - 所以如果你没有在调用awk的同一行定义它,你应该export
它。
答案 3 :(得分:0)
单引号禁用变量插值;双引号没有。
sed -i -e "s/ABC/&$var/g" text.txt
(请注意,当$var
包含/
或sed
特别处理的任何其他字符时,这不是一个好主意。)
答案 4 :(得分:0)
您需要在切换到双引号之前终止单引号(这会阻止插值),或者只使用双引号开头。
也就是说,s
命令改变当前行,它不插入行;你最终会得到一行包含DEFMRD
,而不是MRD
在自己的行上插入。为此,你想要像
sed -i -e "/ABC/a\\
$var\\
." text.txt
答案 5 :(得分:0)
使用awk
:
awk "{print \$0}NR==1{print \"$var\"}" text.txt
或是否已导出var
:
export var=MRD
awk '{print $0}NR==1{print ENVIRON["var"]}' text.txt
答案 6 :(得分:0)
printf '2i\n%s\n.\nw\n' "$var" | ed -s text.txt