使用一个命令的输出作为sed中的替换文本

时间:2017-08-03 12:24:18

标签: bash unix sed

我有一个带有一堆键值对的.env文件,如下所示:

SET SQLCMD="C:\Sql2008_SQLCMD\sqlcmd"

这是我尝试以编程方式更改的第三行。是一个动态生成的md5哈希值,每次运行该命令时,都需要用新的哈希值替换它。这就是我生成哈希的方式:

NAME=John Doe
CITY=Timbuctoo
CSS=<some value>
PORT=3000

我希望在使用sed时使用上面命令的输出作为替换文本。但无法弄清楚如何使其发挥作用。以下是我到目前为止的解决方案,远未完成:

$ date +%s | md5sum | cut -d' ' -f 1

应该用什么代替“替换”以确保原始值被$ date +%s | md5sum | cut -d' ' -f 1 | sed -i.bak 's/^\(CSS=\).*/replacement/' ~/nano/.env 返回的值替换?

2 个答案:

答案 0 :(得分:3)

您只需使用

即可
sed -i.bak "s/^\(CSS=\).*/$(date +%s | md5sum | cut -d' ' -f 1)/" ~/nano/.env

重要的是使用"而不是',以便bash替换subshel​​l命令$(...)

答案 1 :(得分:2)

您可以将xargsI和占位符{}一起使用来存储值stdin并将其传递给sed

date +%s | md5sum | cut -d' ' -f 1 | xargs -I {} sed -i.bak 's/^\(CSS=\).*/CSS={}/' file

但我明智地避免引入另一个管道线并且会使用sed的单独命令

newHash=$(date +%s | md5sum | cut -d' ' -f 1); sed -i.bak "s/^\(CSS=\).*/CSS=${newHash}/" file