定型句を自動化するスクリプトを作成しています。ここに文字列を追加します。
"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つのより単純なコマンドのパイプラインを使用するのと同じです。スクリプトやその他の状況に応じて、これを行うことも、上記のように実行することもできます。