bash – パイピングで’sed’を使う方法

bash grep sed

grepから出力された文字列を置換したいのですが、私は持っています

$ npm info webpack | grep version

それは私を出力します

$ version: '2.1.0-beta.12',

を持っていたいと思っています

$ 2.1.0-beta.12

そこで、sedを使って、不要な部分文字列を置換することで実現できそうな気がします。しかし、ここからが私にとって難しいところです

$ npm info webpack | grep version: | sed s/version: /
sed: -e expression #1, char 10: unterminated `s' command

どうすれば目標を達成できるのか?

  54  None  2016-08-02


ベストアンサー

sedを使うのであれば、grepも使う必要はありません。試してみてください

npm info webpack | sed -En "s/version: '(.*)',/\1/p"

Example:

$ echo  "version: '2.1.0-beta.12'," | sed -En "s/version: '(.*)',/\1/p"
2.1.0-beta.12

代替:awkを使用しています

同様に、awkを使えば、grepも必要ありません

npm info webpack | awk -F"[ ',]+" '/version:/{print $2}'

Example:

$ echo  "version: '2.1.0-beta.12'," | awk -F"[ ',]+" '/version:/{print $2}'
2.1.0-beta.12

どのように機能するのか

  • -F"[ ',]+"

    これは、スペース、単一引用符、カンマ、またはそれらの組み合わせをフィールドの区切り文字として使用するように awk に指示します

  • /version:/{print $2}

    行にversion:が含まれている場合は、2番目のフィールドを表示します

45  John1024  2016-08-02


sed置換コマンド(s)は、検索パターンと置換文字列を期待しています。検索パターンを指定しただけです。また、シェルでは文字列を適切に引用する必要があります

$ npm info webpack | grep 'version:' | sed 's/version: //'

これにより、'2.1.0-beta.12',という結果が得られますが、これはあなたが望んでいるものではありません

grepからの出力は非常にシンプルなので、cutにデリミタ'を付けて、行の2番目のフィールドを取得することができます(複雑な正規表現は必要ありません)

$ npm info webpack | grep -F 'version:' | cut -d "'" -f 2

これで2.1.0-beta.12が出てきます

また、検索する文字列が正規表現ではなく固定文字列なので、-Fgrepに追加しました

8  Kusalananda  2016-08-02


まずは、sedを使ってみてください

npm info webpack | grep version: | sed 's/version: //'

または、awkを使用することができます

npm info webpack | grep version: | awk '{print $2}'

の方が簡単なのではないでしょうか

5  MariusMatutiae  2016-08-02


タイトルとURLをコピーしました