입력 파일에 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"
  }
}

두 번째 명령의 출력을 jq새 파일로 리디렉션한 다음 평소와 같이 파일을 이전 이름으로 이동할 수 있습니다.

$ARGS.named명령줄에서 명명된 변수를 포함하는 객체인 것을 이해한다면 분명히 두 가지를 동시에 수행할 수 있습니다 .

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

결과는 두 가지 더 간단한 명령의 파이프라인을 사용하는 것과 동일하며 스크립트 및 기타 상황에 따라 이 작업을 수행하거나 위에 표시된 대로 수행할 수 있습니다.

관련 정보