如何在shell中用多行文本替换特定行

3duebb1j  于 2023-06-24  发布在  Shell
关注(0)|答案(1)|浏览(217)

我有一行uses: actions/checkout@v3.5.0(* 注意开头的缩进 *),需要用多行文本替换

uses: actions/checkout@v3.5.0
    - name: Set node version
      run: |-
        echo "NODE_VERSION=$(jq -r '.engines.node // "latest"' package.json)" >> $GITHUB_ENV
    - uses: actions/setup-node@v3
      with:
        node-version: ${{ env.NODE_VERSION }}
    - name: Setup project-level .npmrc file and Run Node18 config fix
      run: |
        curl -u ${{ secrets.CICD_ARTYLAB_PUBLISH_USER }}:${{ secrets.CICD_ARTYLAB_PUBLISH_TOKEN }} --fail "https://someurl/api/npm/auth" >> ${{ env.npm_config_userconfig }}
        if [[ $NODE_VERSION -ge 18 ]]; then
          npm config --location project fix
        fi

我确实尝试将多行文本放在一个文件中,并在sed中使用它。但没有用。
sed "s| uses: actions/checkout@v3.5.0|$content|g" edmg-ui-master.yml
获取以下错误。
sed:1:“s| uses:actions/c ...":替换模式内的非转义换行符
还有其他办法吗?

mbzjlibv

mbzjlibv1#

这可能对你有用(GNU sed):

sed -E '/uses: actions\/checkout@v3\.5\.0/{x;s/.*/cat contentFile/e
        :a;G;/^(.+)\n(\s*).*/{s//\2\1/;P;s/[^\n]*(\n|$)//;ba};x;d}' file

这将匹配所需的字符串,将新内容复制到保持缓冲区,然后将前导白色插入保持缓冲区的每一行。
在处理并删除原始行时打印结果。
注意:新内容保存在单独的文件中,例如contentFile,也可以包含缩进。

相关问题