【发布时间】:2016-12-30 09:40:04
【问题描述】:
我正在尝试将模式 (\^|\~?)(\d|x|\*)+\.(\d|x|\*)+\.(\d|x|\*)+ 与 sed 匹配,但没有运气。
我正在运行的文件是这样的:
{
"name": "something",
"version": "0.0.1",
"description": "some desc",
"main": "gulpfile.js",
"directories": {
"test": "tests"
},
"dependencies": {
"babel-polyfill": "^6.7.4",
"babel-preset-es2015": "^6.6.0",
"babel-preset-react": "^6.5.0",
"gulp-clean": "^0.3.2",
"jquery": "^2.1.4",
"lodash": "^4.0.0",
"moment": "^2.13.0",
"moment-timezone": "^0.5.0",
"radium": "^0.16.2",
"react": "^15.1.0",
"react-bootstrap-sweetalert": "^1.1.10",
"react-dom": "^15.1.0",
"react-timeago": "^2.2.1",
"sprintf": "^0.1.5",
"smoothscroll": "~0.2.2"
},
"devDependencies": {
"babel": "^6.3.26",
"babelify": "^7.2.0",
"browserify": "~12.0.1",
"console-stamp": "^0.2.0",
"estraverse-fb": "^1.3.1",
"gulp": "^3.9.0",
"gulp-concat": "^2.6.0",
"gulp-sass": "^2.1.1",
"gulp-sourcemaps": "^1.6.0",
"gulp-util": "^3.0.7",
"lodash": "4.5.1",
"lodash.assign": "^3.2.0",
"lodash.isfunction": "^3.0.8",
"lodash.reduce": "^4.3.0",
"node-sass": "3.4.2",
"react-bootstrap": "^0.29.4",
"react-intl": "2.1.0",
"reactify": "1.1.1",
"sweetalert": "^1.1.3",
"vinyl": "^1.1.0",
"vinyl-buffer": "^1.0.0",
"vinyl-source-stream": "^1.1.0",
"watchify": "^3.4.0",
"jsx-to-string": "~0.2.11"
},
"optionalDependencies": {
"pkg-save": "~1.0.2"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "someurl"
},
"author": "authorname",
"license": "MIT"
}
正如您在 regexr 中看到的,它匹配所需的模式(也匹配“版本”,但这是我稍后会解决的另一个问题): http://regexr.com/3e324
我正在使用以下命令调用 sed:cat package.json | sed 's/(\^|\~?)(\d|x|\*)+\.(\d|x|\*)+\.(\d|x|\*)+/Hello/g' -r
为简洁起见,它输出类似(即未过滤的输入):
...
"dependencies": {
"babel-polyfill": "^6.7.4",
"babel-preset-es2015": "^6.6.0",
"babel-preset-react": "^6.5.0",
"gulp-clean": "^0.3.2",
...
它应该用“Hello”替换所有数字。
我做错了什么?
与坏标志有关(我试过 /gm)
还是没有使用正确的正则表达式引擎(我通过-r 选项来使用扩展正则表达式)?
【问题讨论】:
-
我不知道您的
sed问题的答案(抱歉),但我只想提一下,如果您正在做一些这样的 JSON 工作,您可能想要使用更适合的工具就像jq -
谢谢,这可能是我需要的!我需要一个可以直接操作 package.json 文件的工具,并且我可以完全控制正在更改的内容。
-
我已通过使用
[0-9]而不是\d来修复它。 (如果您处理大量 JSON,我仍然第二次使用jq) -
太好了,谢谢@Aaron。我认为传递
-r将使 sed 能够识别\d字符类。我想我会继续使用jq以获得更好的操作。随意写一个答案,我会将其标记为已批准。 -
所有工具都使用具有不同警告/约束的不同正则表达式风格。使用一些在线正则表达式验证器是没有用的,因为它不能保证给定的正则表达式将在您想要使用它的任何工具中工作。