我有一个看起来像这样的文件:
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
但这也没有用。有什么想法吗?
谢谢!
看看这是否有效。
var="MRD"
sed 's/ABC/&\n'"${var}"'/' text.txt
编辑
我们可以使用任何字符来代替 /。因此,如果我们希望它出现在搜索或替换表达式中,请使用 |
var="</stuff>"
sed 's|ABC|&\n'"${var}"'|' text.txt
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
这样做。
单引号禁用变量插值;双引号没有。
sed -i -e "s/ABC/&$var/g" text.txt
$var
(请注意,当contains/
或任何其他特殊处理的字符时,这不是一个好主意sed
。)
在切换到双引号之前,您需要终止单引号(防止插值),或者只使用双引号开始。
也就是说,该s
命令会更改当前行,它不会插入行;您最终会得到包含DEFMRD
, 的单行,而不是MRD
插入自己的行。为此,你想要类似的东西
sed -i -e "/ABC/a\\
$var\\
." text.txt
与awk
:
awk "{print \$0}NR==1{print \"$var\"}" text.txt
或者如果var
已导出:
export var=MRD
awk '{print $0}NR==1{print ENVIRON["var"]}' text.txt
printf '2i\n%s\n.\nw\n' "$var" | ed -s text.txt