开发者问题收集

如何使用 sed 命令插入变量内容

2020-04-15
1465

我有 shell 脚本 (.sh),我正在尝试使用以下命令将一个文件的内容插入到另一个文件中,但它抛出了错误“sed:-e 表达式 #1,字符 28:未知选项 `s'”:

filename="/home/user1/filename.txt"
contents=$(du -sh /var/log/test.log)
hostname > $filename
sed -i "/test_string/ s/$/, $contents" $filename

我似乎无法弄清楚根本问题出在哪里。有人可以帮忙吗?

示例:

filename= /home/user1/filename.txt

hostname = server1.mydomain.com

因此,运行 hostname > 后, $filename 的内容为 server1.mydomain.com $filename

du -sh /var/log/test.log 命令的输出为 1.3M /var/log/test.log

因此,运行 sed -i "/mydomain.com/ s/$/, $contents" $filename 应该会将以下文件名的内容更新为:

server1.mydomain.com, 1.3M /var/log/test.log

但是正如我上面提到的,它会引发错误。

2个回答

尝试这个

sed -i  "s#\$#, ${contents}#g" 

演示:

$cat file.txt 
server1.mydomain.com
$echo $contents 
1.3M /var/log/test.log
$sed -i  "s#\$#, ${contents}#g"  file.txt 
$cat file.txt 
server1.mydomain.com, 1.3M    /var/log/test.log
$

sed 命令用法是 s#pattern to search#pattern/String replacement#occurence

Digvijay S
2020-04-16

使用 perl 或其他语言更容易做到这一点,以避免变量中的字符问题导致 sed 解析错误:

contents=$(du -sh /var/log/test.log) perl -pi -e '$_ .= ", $ENV{contents}" if /test_string/' "$filename"

或者使用 ed 编辑 文件,并完全避免使用 $contents 变量:

ed -s "$filename" <<'EOF'
/test_string/a
,<space>
.
r !du -sh /var/log/test.log
.-2,.j
w
EOF

<space> 替换为文字空格。

这组起初神秘的命令首先移动到与正则表达式 test_string 匹配的第一行,然后 a 在其后附加一行 ,<space> ,然后 r 读取 du 命令的输出并将其插入到其后的一行中,最后 将这三行合并为一行,并将 修改后的文件写回磁盘。

(假设 du 调用只返回一行。)

Shawn
2020-04-15