次の情報を含むファイルがあります。
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番目の要素は次のようになります。ここで配列名はです。command
var
${var[0]}
${var[1]}
infoC