2016-08-23 12 views
1

パターン(\^|\~?)(\d|x|\*)+\.(\d|x|\*)+\.(\d|x|\*)+sedを一致させようとしています。 私はを通じて実行しているファイルはこれです:正規表現と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オプションを渡しています)?

+1

私はあなたの 'sed'問題(申し訳ありません)に対する答えはわかりませんが、JSONのような仕事をしているかどうかを言いたいのですが、[jq]のようなツールを使いたいかもしれません。 (https://stedolan.github.io/jq/) – Matt

+0

ありがとう、これは私が必要なものかもしれません! 私はpackage.jsonファイルを直接操作できるツールが必要です。また、私は何が変更されているかを完全に制御できます。 –

+0

私は '\ d'ではなく[[0-9]'を使って修正しました。 (私はまだJSONをたくさん扱う場合には 'jq'を使って2番目になります) – Aaron

答えて

4

POSIX正規表現は[[:digit:]][[:alnum:]]のようないくつかの名前の文字クラスを、サポートしていますが、彼らは、そのような\d\wとして速記のクラスをサポートしていません。

いくつかのGNU拡張は、速記のクラスのサポートを持って、彼らは、\w\W\s\Sregular-expressions.infoに応じてそれらのいくつかに制限されています。

正規表現の\d[0-9]に変更すると、ドキュメントを変換できました。正規表現は(\^|\~?)([0-9]|x|\*)+\.([0-9]|x|\*)+\.([0-9]|x|\*)+、またはそれより良い[~^]([0-9x*]+\.){2}[0-9x*]になります(Ed Mortonに感謝!)。

sed -E 's/[~^]([0-9x*]+\.){2}[0-9x*]/Hello/' package.json 

とマットで述べたように、あなたがそのようなjqとしてJSONパーサーを使用したほうが良いと思います:注意点として、あなたのコマンドはcatを使用しない、次のように書き換えることができ

+1

あなたのスクリプトは、 '-E'ではなく' -r'のために現在GNU sed特有です。 EREを有効にして、エスケープする必要のない文字をエスケープしています。 '〜'と '([0-9] | x | \ *)+'のようなREのセグメントは不必要に長く複雑なものです。私はOPの機能していないスクリプトをコピーしたので、それは理解していますが、それをきれいにするのが良いでしょう - すべてがもっと移植可能なように(テストされていませんが、/[〜^]([0-9x *] + \。){2} [0-9x *]/Hello/''。 –

+1

ありがとう、私は(GNU sedで)それをテストし、私の答えを更新しました。私は '-E'が存在することを知らなかった、私の' '人間の誓い 'に現れない! – Aaron

+1

はい。 -rの代わりにBSD sedや新しいGNU sedsでサポートされていますが、GNUの人々はドキュメントをまだ更新していません。 –

関連する問題