我正在尝试获取 npm 包的版本,并使用它来替换另一个文件中的值。具体来说,我想获取版本package.json
并使用它来替换 wordpressstyle.css
版本。
我能够使用 成功获取版本号npm pkg get version | sed 's/"//g'
,但我已经尝试了每种变体,以将其输出放入s
另一个管道的中sed
。(我尝试了 -e -r -i 及其中的所有组合,我尝试了$1
、\1
、${echo $1}
等……)
npm pkg get version | sed 's/"//g' | sed "s/1.0.0/$1/g" dist/style.css
(在最终版本中,我将在第二个 sed 中使用 -i)
在 style.css 文件中,我想1.0.0
用以下输出替换npm pkg get version | sed 's/"//g'
答案1
您不能将变量通过管道传递给 sed。这无所谓如何你写的是反向引用——实际上没有特征在 sed 中,这实际上会按照您尝试的方式产生反向引用。
(sed 仅使用 stdin 来获取实际输入文本,如果您指定要编辑的文件(style.css),那么根本不会使用 stdin。)
$
但是,当在双引号字符串中使用时,它不会被 sed 本身扩展 - 它会在 sed 运行之前由您的 shell 扩展。对于反向引用来说,这不太好(人们会使用\$
它来将实际的 $ 传递给命令);但对于您来说,这正是您所需要的 shell 功能。
不要尝试使用管道连接两者(第二个 sed 不会接受通过管道传输的任何内容),而是使用两个单独的管道和 shell 的变量替换:
$(command)
使用或将 npm 的结果存储在 shell 变量中`command`
:version=$(npm pkg get version | sed 's/"//g')
(用于取消引用 npm 的 JSON 输出会稍微“技术上正确”一些
jq -r .
,但这只是一个版本字符串,所以你的 sed 就足够了。)将变量作为 sed 命令的一部分:
sed -i "s/1\.0\.0/$version/g" dist/style.css
请注意,这是按字面意思展开的,例如,如果版本是
4.2beta
,那么实际运行的命令是sed -i "s/1\.0\.0/4.2beta/g"
– 如果 sed 的分隔符可能出现在变量内,这一点很重要/
。(就您而言,希望不会出现这种情况。)可以合并这两个步骤,例如
sed -i "s/old/$(npm get | sed)/g" file
,但很快就会变得难以阅读,所以不要这样做。如果您有 node.js,请考虑编写一个执行编辑的 node.js脚本,而不是使用脆弱的shell工具。