Macos 从变量在文件中插入文本
我有一个类似以下内容的文件:Macos 从变量在文件中插入文本,macos,bash,shell,unix,Macos,Bash,Shell,Unix,我有一个类似以下内容的文件: ABC DEF GHI 我有一个shell变量,看起来像这样: var="MRD" ABC MRD DEF GHI 我要做的是使我的文件如下所示: 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 但这也不起作用。有什么想法吗 谢谢
ABC
DEF
GHI
我有一个shell变量,看起来像这样:
var="MRD"
ABC
MRD
DEF
GHI
我要做的是使我的文件如下所示:
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
但这也不起作用。有什么想法吗
谢谢 单引号禁用变量插值;双引号不起作用
sed -i -e "s/ABC/&$var/g" text.txt
(请注意,当$var
包含/
或任何其他sed
特别处理的字符时,这不是一个好主意。)看看这是否有效
var="MRD"
sed 's/ABC/&\n'"${var}"'/' text.txt
编辑
我们可以用任何字符代替/。因此,如果我们希望它出现在搜索或替换表达式中,请使用|
var="</stuff>"
sed 's|ABC|&\n'"${var}"'|' text.txt
var=“”
sed's | ABC |&\n'${var}'|'text.txt
sed可以执行--它可以附加:
sed "/ABC/a $var"
在一些旧版本的sed中,您必须编写
sed "/ABC/a\\
$var"
在切换到双引号之前,需要终止单引号(防止插值),或者只使用双引号开始 也就是说,
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
var='awk'{print$0}NR==1{print ENVIRON[“var”];}\
这适用于var=“MRD”。现在,如果var=”,你会怎么做。编辑:我可能需要转义所有内容……这仍然意味着你不能处理任意文本——如果你的字符串中有一个需要转义的
。通过引用环境变量或argv条目,使用awk或perl可以避免这种情况;塞德没有同等的机制。同意@Charles。如果我从头开始做,我也更喜欢awk而不是sed,因为它提供了更好的控制。我只是扩展OP的问题,因为它可能是一个更大的脚本的一部分,或者是一些不容易更改为awk的东西。假设输入和替换都被很好地理解了,在几乎所有的情况下,都可以找到一个字符作为sed中的分隔符。这似乎已经成功了,因为我的字符串中没有|。谢谢查尔斯,阿米特!最后一个建议是,使用“${var}”
而不仅仅是“${var}”
——后一种方法意味着变量中的空格或shell通配符可能导致字符串拆分或通配符扩展。如果使用awk,您可以(而且应该!)通过环境传递变量,而不需要转义它们来安全地通过shell。
tempfile=$(mktemp "${infile}.XXXXXX")
awk ... <"$infile" >"$tempfile" \
&& mv "$tempfile" "$infile"
printf '2i\n%s\n.\nw\n' "$var" | ed -s text.txt