web-dev-qa-db-ja.com

配管で '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

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

27
Oskar Szura

Sedを使うつもりなら、grepも使う必要はありません。試してください:

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

例:

$ 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}'

例:

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

仕組み:

  • -F"[ ',]+"

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

  • /version:/{print $2}

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

23
John1024

sed置換コマンド(s)は検索パターンと置換文字列を期待します。検索パターンのみを指定しました。また、シェルで文字列を正しく引用する必要があります。

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

これは'2.1.0-beta.12',という結果をあなたに与えるでしょう、それはあなたが望むものでは全くありません。

grepからの出力はとても単純なので、行の2番目のフィールドを取得するためにcutを区切り文字'と共に使用することができます(複雑な正規表現を必要としません)。

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

これはあなたに2.1.0-beta.12を与えるでしょう。

検索する文字列は固定文字列であり、正規表現ではないため、grep-Fを追加しました。

6
Kusalananda

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

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

あるいはawkを使うこともできます。

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

これはおそらく簡単です。

1
MariusMatutiae