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

The*_*ner 3 unix bash sed

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

NAME=John Doe
CITY=Timbuctoo
CSS=<some value>
PORT=3000
Run Code Online (Sandbox Code Playgroud)

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

$ date +%s | md5sum | cut -d' ' -f 1
Run Code Online (Sandbox Code Playgroud)

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

$ date +%s | md5sum | cut -d' ' -f 1 | sed -i.bak 's/^\(CSS=\).*/replacement/' ~/nano/.env
Run Code Online (Sandbox Code Playgroud)

用什么代替“替换”,以确保原始值被返回的值替换cut

Edu*_*ich 6

您可以简单地使用

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

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

  • 这应该是公认的答案。 (2认同)

Ini*_*ian 5

您可以使用xargswithI和占位符{}来存储值stdin并将其传递给sedas

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

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

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