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?您知道& 字符在seds 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 中的文本的主要内容,如果未能解决你的问题,请参考以下文章

如何用sed中的另一个路径替换路径?

如何用反斜杠和空格“\”替换空格,以便 bash shell 脚本可以从 .tsv 文件中读取文件名并执行 rsync 复制

如何在bash中将空格替换为新行[重复]

sh Bash - 通过sed替换行脚本

SED 如何用正则表达式替换 Line

如何用sed命令替换一行中的某个字符串