如何用jq或Linux工具移除package.json中@glen/包的版本后缀?
移除package.json中@glen/前缀包的版本标签方案
我正在开发一个依赖内部npm包的Web应用,这些包均以@glen/为前缀。需要解析并修改package.json文件,专门移除这类包版本号中的-dev.3和-rc.0标签——例如将"@glen/manager": "^3.0.0-rc.0"修改为"@glen/manager": "^3.0.0"。优先使用jq工具实现,也接受Linux环境下的其他解决方案。
原始package.json
{ "name": "@glen/web_trans", "version": "1.0.0", "scripts": { "build": "nuxt build", "dev": "nuxt dev", "generate": "nuxt generate", "prepare": "husky install" }, "devDependencies": { "@glen/manager": "^3.0.0-rc.0", "@glen/handler": "^1.3.6", "@glen/extension": "^3.3.0-dev.3", "@nuxt/devtools": "^1.0.0-beta.2", "@nuxtjs/device": "^3.1.1", "@nuxtjs/i18n": "^8.0.0-rc.5", "eslint": "^8.29.0", "husky": "^8.0.0", "jsdom": "^21.1.1", "nuxt": "3.7.4", "vitest": "^0.29.7" }, "dependencies": { "@glen/manager": "^3.0.0-rc.0", "@glen/handler": "^1.3.6", "@glen/extension": "^3.3.0-dev.3", "@pinia/nuxt": "^0.4.6", "@vee-validate/rules": "^4.11.3", "@vue/apollo-composable": "^4.0.0-beta.1", "@vue/eslint-config-typescript": "^11.0.2", "@vueuse/components": "^9.6.0", "@vueuse/core": "^9.6.0", "websocket": "^1.0.34" }, "extensionPack": [ "Vue.volar" ], "overrides": { "vue": "latest" } }
修改后的预期结果
{ "name": "@glen/web_trans", "version": "1.0.0", "scripts": { "build": "nuxt build", "dev": "nuxt dev", "generate": "nuxt generate", "prepare": "husky install" }, "devDependencies": { "@glen/manager": "^3.0.0", "@glen/handler": "^1.3.6", "@glen/extension": "^3.3.0", "@nuxt/devtools": "^1.0.0-beta.2", "@nuxtjs/device": "^3.1.1", "@nuxtjs/i18n": "^8.0.0-rc.5", "eslint": "^8.29.0", "husky": "^8.0.0", "jsdom": "^21.1.1", "nuxt": "3.7.4", "vitest": "^0.29.7" }, "dependencies": { "@glen/manager": "^3.0.0", "@glen/handler": "^1.3.6", "@glen/extension": "^3.3.0", "@pinia/nuxt": "^0.4.6", "@vee-validate/rules": "^4.11.3", "@vue/apollo-composable": "^4.0.0-beta.1", "@vue/eslint-config-typescript": "^11.0.2", "@vueuse/components": "^9.6.0", "@vueuse/core": "^9.6.0", "websocket": "^1.0.34" }, "extensionPack": [ "Vue.volar" ], "overrides": { "vue": "latest" } }
解决方案
方法一:使用jq工具(推荐)
jq是专门处理JSON的工具,能精准且安全地修改JSON结构,不会破坏文件格式:
jq ' (.dependencies, .devDependencies) |= with_entries( if .key | startswith("@glen/") then .value |= sub(/-rc\.0|-dev\.3$/; "") else . end ) ' package.json > temp.json && mv temp.json package.json
说明:
- 同时处理
dependencies和devDependencies两个字段下的依赖 - 遍历每个依赖项,仅对包名以
@glen/开头的条目进行版本修改 - 用正则表达式替换掉版本号末尾的
-rc.0或-dev.3标签 - 先将结果写入临时文件,再替换原文件,避免直接修改导致的文件损坏
方法二:使用sed(备选方案)
如果环境中没有jq,可使用sed做文本替换(注意:此方法依赖package.json的格式规范,比如键值对的引号、空格格式固定):
sed -i.bak -E 's/("@glen\/[^"]+":\s*"[^"]+)-rc\.0"/\1"/; s/("@glen\/[^"]+":\s*"[^"]+)-dev\.3"/\1"/' package.json
说明:
-i.bak:修改原文件的同时创建后缀为.bak的备份文件- 两个正则表达式分别匹配
@glen/前缀包的版本号,移除目标标签 - 若
package.json的格式有变动(如空格、换行不同),此方法可能失效,优先推荐jq方案
内容的提问来源于stack exchange,提问作者MacLeon
相关产品推荐
相关产品推荐

