2つの変数間の値を抽出して変数に保存するコマンド

2つの変数間の値を抽出して変数に保存するコマンド

2つの変数の間の値(数値)を抽出して、その値を別の変数に保存しようとしています。

sedコマンドを使用していますが、出力は出ません。

#!/usr/bin/env bash
variable1=`cat $1`
variable2=`echo "$variable1" | cut -c 18`
echo "$variable2"
variable3=`echo "$variable1" | cut -c 60`
echo "$variable3"
string="${variable3}xyz${variable2}"
echo $string
line=`sed -n '/'"$string"'/,/'"$variable2"'/ p' $1`
echo $line

$searchString と $variable2 の間の数値を抽出する方法を提案してください。$stringこれは:&xyz!そして$変数2これは:、私は60を持っています。&xyz! 60! だから60を抽出する必要があります。

私も試しました

line=`sed -nr "s/$string([0-9]+),$variable2/\1/ p" $1` 

しかし、$ lineをechoすると、ファイル全体の内容が印刷されます。

事前にありがとう

答え1

これはシェルパラメータの置き換えによって行うことができます。

# setup
line='hello&xyz!60!world'
string='&xyz!'
variable2='!'

# now, remove from the beginning up to the first instance of "&xyz!"
tmp=${line#*$string}

# $tmp now holds 60!world

# remove from the end the last "!" and all following characters
result=${tmp%$variable2*}
echo $result
# => 60

コンマのためにsedコマンドが失敗したようです。

  1. 入力にカンマがないため、一致するものがないため、何も印刷されません。

    $ set -x
    $ echo "$line" | sed -nr "s/$string([0-9]+),$variable2/\1/ p"
    + sed -nr 's/&xyz!([0-9]+),!/\1/ p'
    + echo 'hello&xyz!60!world'
    
  2. カンマを削除すると、一致がありますが、プレフィックスとサフィックスはそのまま残ります。

    $ echo "$line" | sed -nr "s/$string([0-9]+)$variable2/\1/ p"
    + sed -nr 's/&xyz!([0-9]+)!/\1/ p'
    + echo 'hello&xyz!60!world'
    hello60world
    
  3. 前後のテキストも一致します。

    $ echo "$line" | sed -nr "s/.*$string([0-9]+)$variable2.*/\1/ p"
    + sed -nr 's/.*&xyz!([0-9]+)!.*/\1/ p'
    + echo 'hello&xyz!60!world'
    60
    

関連情報