用 bash 中的文件替换两个标记之间的文本

问题描述 投票:0回答:2

我想用

INSERT
中的文件内容替换
template.js
中的文本
insert.json
并将其写入
result.js

插入.json:

{
  "insert": true,
  "other": "you can ignore line indentation"
}

模板.js:

function test() {
  const x = INSERT;
  console.log(x);
}

结果.js:

function test() {
  const x = {
  "insert": true,
  "other": "you can ignore line indentation"
};
  console.log(x);
}

我正在寻找替代

INSERT
。但另一种选择,例如要查找的正则表达式,也很棒:

  • const x = (INSERT);
    替换
    $INSERT
  • (const x = )INSERT(;)
    替换
    $1 $INSERT $2

你不能使用像

$(cat insert.json)
这样的东西,因为insert.json文件很大并且超出了终端字符限制。

linux bash replace
2个回答
0
投票

不是我的问题的解决方案,而是另一种变体,如果有人需要的话。

插入.js:

const x = {
  "insert": true,
  "other": "you can ignore line indentation"
};

模板.js:

function test() {
// insert.js start
    const x = {};
// insert.js end
    console.log(x);
}

脚本.sh:

#!/usr/bin/env bash

replaceTemplateStartEnd() {
    local expStart='^\/\/ insert.js start'
    local expEnd='^\/\/ insert.js end'
    local insertFile='insert.js'
    sed -e "/${expStart}/!b;:a;N;/${expEnd}/M!ba;r ${insertFile}" -e 'd' template.js > "${1}"
}

replaceTemplateStartEnd 'result.js'

结果.js:

function test() {
const x = {
  "insert": true,
  "other": "you can ignore line indentation"
};
    console.log(x);
}


0
投票

如果

template.js
恰好包含 cat 一次,则除了
INSERT
之外,无需任何外部命令即可工作:

( TEMPLATE="$(cat template.js)"
  TEMPLATE2="${TEMPLATE#*INSERT}"
  echo "${TEMPLATE%%INSERT*}"
  cat insert.json
  echo "$TEMPLATE2"
)

如果 template.js 恰好包含

INSERT
一次,则无需任何外部命令即可工作:

( TEMPLATE="$(while read L; do echo "$L"; done <template.js)"
  TEMPLATE2="${TEMPLATE#*INSERT}"
  echo "${TEMPLATE%%INSERT*}"
  cat insert.json
  echo "$TEMPLATE2"
)
© www.soinside.com 2019 - 2024. All rights reserved.