入力ファイルへのsedコマンドの書き込み

入力ファイルへのsedコマンドの書き込み

定型句を自動化するスクリプトを作成しています。ここに文字列を追加します。

"compile": "browserify js/main.js > ./dist/bundle.js -t babelify",
"watch": "watchify js/*.js -o ./dist/bundle.js -d",

sedを使って文字列を見つけました。「スクリプト」そしてこうして付けました。

sed '/"scripts"/a "compile": "browserify js/main.js > ./dist/bundle.js -t babelify",\n "watch": "watchify js/*.js -o ./dist/bundle.js -d",' package.json

したがって、コマンドの構文は次のとおりです。

sed '/pattern/a' input

私の問題は、このコマンドが入力ファイルを変更せず、出力をファイルに書き込むこともできないことです。例えば、

sed '/pattern/a' input > output.txt

私は何が間違っていましたか?


ターゲット:

入力ファイル(package.json):

{
  "name": "torrent-search-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "torrent-search-api": "^2.1.4"
  },
  "devDependencies": {
    "@babel/core": "^7.16.7",
    "@babel/preset-env": "^7.16.8",
    "babelify": "^10.0.0",
    "browserify": "^17.0.0"
  }
}
$ <command> package.json

出力:

cat package.json
{
  "name": "torrent-search-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "compile": "browserify js/main.js > ./dist/bundle.js -t babelify",
    "watch": "watchify js/*.js -o ./dist/bundle.js -d",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "torrent-search-api": "^2.1.4"
  },
  "devDependencies": {
    "@babel/core": "^7.16.7",
    "@babel/preset-env": "^7.16.8",
    "babelify": "^10.0.0",
    "browserify": "^17.0.0"
  }
}

答え1

オブジェクトに単一のキーと値のペアを追加するには、次の手順を実行しますscripts

jq --arg key 'compile' --arg value 'browserify js/main.js > ./dist/bundle.js -t babelify' \
    '.scripts += { ($key): $value }' file

キーと値の両方を追加するには、まったく同じ式を使用してjq出力を再パイプしますが、内部変数$key$value変数に異なる値を使用します。

jq --arg key 'compile' --arg value 'browserify js/main.js > ./dist/bundle.js -t babelify' \
    '.scripts += { ($key): $value }' file |
jq --arg key 'watch' --arg value 'watchify js/*.js -o ./dist/bundle.js -d' \
    '.scripts += { ($key): $value }'

問題のファイルが与えられた場合、これは次のように生成されます。

{
  "name": "torrent-search-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "compile": "browserify js/main.js > ./dist/bundle.js -t babelify",
    "watch": "watchify js/*.js -o ./dist/bundle.js -d"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "torrent-search-api": "^2.1.4"
  },
  "devDependencies": {
    "@babel/core": "^7.16.7",
    "@babel/preset-env": "^7.16.8",
    "babelify": "^10.0.0",
    "browserify": "^17.0.0"
  }
}

2番目のコマンドの出力をjq新しいファイルにリダイレクトし、通常どおりにファイルを古い名前に移動できます。

$ARGS.namedコマンドラインで名前付き変数を含むオブジェクトであることを理解している場合は、明らかに2つのことを同時に実行できます。

jq --arg compile 'browserify js/main.js > ./dist/bundle.js -t babelify' \
   --arg watch   'watchify js/*.js -o ./dist/bundle.js -d' \
   '.scripts += $ARGS.named' file

結果は、2つのより単純なコマンドのパイプラインを使用するのと同じです。スクリプトやその他の状況に応じて、これを行うことも、上記のように実行することもできます。

関連情報