配管で「sed」を使用する方法


34

から出力された文字列を置換したい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

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

回答:


30

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番目のフィールドを印刷します。


2
この-Eオプションは明らかにERE構文を使用することを意味しますが、私のGNU sed 4.2.2マニュアルではについてのみ言及しています-r-Eしかし、動作します!
法律

2
@ Law29はい。しかし、すべての合理的に最新のGNU sedにとって-Eドキュメント化されていない同義語です-r。噂によると、POSIXは-EBSD / OSXがすでに使用しているに落ち着いており、それが最終標準に追加された場合、私たちはすべてに移行し-Eます。
John1024

6

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

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


1

まず、以下を使用してみてくださいsed

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

または、次を使用できますawk

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.