使用管道 sed 的输出作为第二个 sed 的替换值

使用管道 sed 的输出作为第二个 sed 的替换值

我正在尝试获取 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 的变量替换:

  1. $(command)使用或将 npm 的结果存储在 shell 变量中`command`

    version=$(npm pkg get version | sed 's/"//g')
    

    (用于取消引用 npm 的 JSON 输出会稍微“技术上正确”一些jq -r .,但这只是一个版本字符串,所以你的 sed 就足够了。)

  2. 将变量作为 sed 命令的一部分:

    sed -i "s/1\.0\.0/$version/g" dist/style.css
    

    请注意,这是按字面意思展开的,例如,如果版本是4.2beta,那么实际运行的命令是sed -i "s/1\.0\.0/4.2beta/g"– 如果 sed 的分隔符可能出现在变量内,这一点很重要/。(就您而言,希望不会出现这种情况。)

  3. 可以合并这两个步骤,例如sed -i "s/old/$(npm get | sed)/g" file,但很快就会变得难以阅读,所以不要这样做。

  4. 如果您有 node.js,请考虑编写一个执行编辑的 node.js脚本,而不是使用脆弱的shell工具。

相关内容