Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 从变量在文件中插入文本_Macos_Bash_Shell_Unix - Fatal编程技术网

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