从变量中插入文件

时间:2012-04-10 23:17:10

标签: macos bash shell unix

我有一个看起来像这样的文件:

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 

但这也不起作用。有什么想法吗?

谢谢!

7 个答案:

答案 0 :(得分:3)

看看是否有效。

var="MRD"
sed 's/ABC/&\n'"${var}"'/' text.txt

修改

我们可以使用任何字符代替/。因此,如果我们希望它在搜索或替换表达式中,请使用|

var="</stuff>"
sed 's|ABC|&\n'"${var}"'|' text.txt

答案 1 :(得分:2)

sed可以more than search and replace - 它可以附加:

sed "/ABC/a $var"

在某些旧版本的sed中,您必须编写

sed "/ABC/a\\
$var"

答案 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