如何使用 sed 命令插入变量内容
我有 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
但是正如我上面提到的,它会引发错误。
尝试这个
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
使用
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
调用只返回一行。)