sedを使用して列から複数のデータを抽出する

sedを使用して列から複数のデータを抽出する

次の情報を含むファイルがあります。

Info A: 1
Info B: 2
Info C: 3
Info D: 4

Info A: 1
Info B: 2
Info C: 123
Info D: 4

これでInfo Cを使ってラインを取得しようとしていますが、別々に使用する必要があります。最初のブロックのInfo Cの出力を取得するコマンドと、2番目のブロックのInfo Cの出力を取得するコマンドが必要です。この命令は、2つのブロックCの情報を得るのに有効であった。コマンドの最初の部分は、Info Cを含む行を除くすべての行を削除します。コマンドの2番目の部分では、「Info C:」文字列を削除します。

cat test2 | sed -e '/Info C: /!d' -e 's/Info C: //'

出力には次の値のみが含まれます。

3
123

今私は自分で解決するためにsedのいくつかのパラメータを試しましたが、何もうまくいきませんでした。

次の解決策が私に適しています。最初または最後の行だけを印刷します。

cat test2 | sed -e '/Info C: /!d' -e 's/Info C: //' | sed -n '$p'
cat test2 | sed -e '/Info C: /!d' -e 's/Info C: //' | sed -n '1p'

しかし、知りたいです。 sed 2番目のパイプなしのソリューションはありますか?

ベストアンサー1

シェルが配列をサポートしている場合は、次のようにできます。

$ infoC=( $(sed -n 's/Info C: \(.*\)/\1/p' file ) )
$ echo ${infoC[0]}
3
$ echo ${infoC[1]}
123

またはGNUを使用してくださいsed

infoC=($(sed -rn 's/Info C: (.*)/\1/p' file ))

sedここではより簡単なコマンドを使用しています。正常な出力を抑えるので、-nユーザーが指示した行だけを印刷します。代替演算子は次の行と一致しますInfo C:捕獲(括弧を含む)別の名前で保存する値\1。したがって、行を交換して\1印刷します(p最後の行)。

これは配列の出力を配列に保存する方法ですvar=( $(command) )。最初の要素は次のようになり、2番目の要素は次のようになります。ここで配列名はです。commandvar${var[0]}${var[1]}infoC

おすすめ記事