3

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

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 

但这也没有用。有什么想法吗?

谢谢!

4

7 回答 7

3

看看这是否有效。

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

编辑

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

var="</stuff>"
sed 's|ABC|&\n'"${var}"'|' text.txt
于 2012-04-10T23:21:45.390 回答
2

sed 可以做的不仅仅是搜索和替换——它可以附加:

sed "/ABC/a $var"

在一些旧版本的 sed 中,你必须写

sed "/ABC/a\\
$var"
于 2012-04-10T23:22:55.510 回答
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这样做。

于 2012-04-10T23:41:58.970 回答
0

单引号禁用变量插值;双引号没有。

sed -i -e "s/ABC/&$var/g" text.txt

$var(请注意,当contains/或任何其他特殊处理的字符时,这不是一个好主意sed。)

于 2012-04-10T23:21:29.583 回答
0

在切换到双引号之前,您需要终止单引号(防止插值),或者只使用双引号开始。

也就是说,该s命令会更改当前行,它不会插入行;您最终会得到包含DEFMRD, 的单行,而不是MRD插入自己的行。为此,你想要类似的东西

sed -i -e "/ABC/a\\
$var\\
." text.txt
于 2012-04-10T23:24:14.183 回答
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
于 2012-04-10T23:26:18.050 回答
0
printf '2i\n%s\n.\nw\n' "$var" | ed -s text.txt
于 2012-04-14T22:46:05.623 回答