Bash 脚本:如何用 sed 替换 package.json 中的文本
Posted
技术标签:
【中文标题】Bash 脚本:如何用 sed 替换 package.json 中的文本【英文标题】:Bash script: How to replace text in package.json with sed 【发布时间】:2021-09-29 20:41:22 【问题描述】:我只是想写一个非常基本的脚本,
在新项目文件夹中初始化 npm 安装 nodemon 创建一个 index.js 文件 在 nodemon 的 package.json 中添加启动命令 将“console.log”写入 index.js 文件我似乎很接近,但调整 package.json 不起作用。不知何故,搜索变量是两次...
我想实现:
"test": "echo \"Error: no test specified\" && exit 1",
"start": "nodemon my_file.js"
我成功了:
"test": "echo \"Error: no test specified\" "test": "echo \"Error: no test specified\" && exit 1""test": "echo \"Error: no test specified\" && exit 1" exit 1","start": "nodemon my_file.js"
完整代码
#!/bin/bash -e
set -e
clear
# Init npm
npm init -y && npm i --save-dev nodemon && touch index.js
wait
# find test command
constToFind='\"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"'
# add nodemon command (with comma, line break and tab)
replacement=',\n\t\"start\": \"nodemon my_file.js\"'
combineReplacement="$constToFind$replacement"
# Add start command to package.json
sed -i "s/$constToFind/$combineReplacement/g" package.json
# Create entry javascript file with console.clear on tops
echo "console.clear();" >> index.js
【问题讨论】:
你必须使用sed吗?为什么不使用其他 cna 解析 json 的工具,例如jq
?您知道&
字符在sed
s s
命令替换部分中的含义吗?也许***.com/questions/407523/… 能解决你的问题?
不确定,我昨天刚用它来调整另一个脚本中的 .env 文件,效果很好。现在我只是寻找一个简单的工具来调整各种文件中的文本,因为我不需要经常这样做。但我牢记这一点,下次如果我需要处理 json。其实我不知道,它只是上次工作,所以它得到了我的蓝图。但我会检查一下。 – 谢谢。
【参考方案1】:
您可以使用 sed a
命令追加而不是替换:
$ addon='\"start\": \"nodemon my_file.js\"'
$ sed "/$constToFind/a\
$addon
" package.json
"test": "echo \"Error: no test specified\" && exit 1",
"start": "nodemon my_file.js"
(如果您关心您的package.json
文件,请仅在您检查它确实按预期工作后使用-i
)。
如果您的 sed
版本支持替代语法,这会更简单一些:
$ addon='\"start\": \"nodemon my_file.js\"'
$ sed "/$constToFind/a$addon" package.json
"test": "echo \"Error: no test specified\" && exit 1",
"start": "nodemon my_file.js"
【讨论】:
太棒了。这比我尝试的要好得多。奇怪的是,您之前/未编辑的答案效果很好(# add nodemon command addon=',"start\": \"nodemon my_file.js\"' # Add start command to package.json sed -ir "/$constToFind/一个\ $插件“包.json)。但是更新的,无论有没有 -i 或 -ir 或 -r 都没有。无论如何,它有效。谢谢你。 啊!你用的是什么版本的sed
?
(sed --version 结果:sed (GNU sed) 4.7
我的是 4.8。可能是这样。或者没有(我这里没有安装 4.7)。无论如何,我恢复了工作答案并添加了更简单的答案,以防它受到支持。以上是关于Bash 脚本:如何用 sed 替换 package.json 中的文本的主要内容,如果未能解决你的问题,请参考以下文章
如何用反斜杠和空格“\”替换空格,以便 bash shell 脚本可以从 .tsv 文件中读取文件名并执行 rsync 复制