【问题标题】:How to insert a variable content using sed command如何使用 sed 命令插入变量内容
【发布时间】:2020-07-29 01:32:48
【问题描述】:

我有 shell 脚本 (.sh),我正在尝试使用以下命令将文件的内容插入到另一个文件中,但我抛出错误“sed: -e expression #1, char 28: unknown option to `s'":

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

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

例子:

文件名=/home/user1/filename.txt

主机名 = server1.mydomain.com

所以$filename的内容在运行hostname > $filename之后是server1.mydomain.com

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

但正如我上面提到的,它抛出了一个错误。

【问题讨论】:

标签: shell sed


【解决方案1】:

试试这个

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

【讨论】:

    【解决方案2】:

    使用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
    

    &lt;space&gt; 替换为文字空格。

    这组神秘的命令首先移动到匹配正则表达式test_string的第一行,然后a在其后面追加一行,&lt;space&gt;,然后r读取du 命令的输出,然后插入一行,最后j将这三行合二为一,w写入修改后的文件回到磁盘。

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

    【讨论】:

    • 不幸的是,我们的服务器上没有安装 ed 或 perl。 :(
    • (特别是缺少ed,因为它是标准的 POSIX 实用程序)
    猜你喜欢
    • 2022-01-08
    • 2022-10-07
    • 2013-10-09
    • 1970-01-01
    • 2012-06-24
    相关资源
    最近更新 更多