文字列正規表現busybox間の文字列の抽出

文字列正規表現busybox間の文字列の抽出

BusyBoxで正規表現を使用して2つの文字列の間で文字列を抽出しようとしています。現地でできました。

extract_string=$(echo $content | grep -P '(?<=CURRENT_VERSION ")(.*)(?=")' -o)

残念ながら、このBusyBoxバージョンのgrepコマンドはこの-Pオプションをサポートしていません。sedawkおよびを使用できますgrep

ひも:#define CURRENT_VERSION "1.0.0.2" some other random text

出力:1.0.0.2

私がこれを達成できる他の方法を知っている人はいますか?

オペレーティングシステム:カーネル 2.6.x

便利:ビジボックス1.2xで

答え1

そしてsed

extract_string=$(
  printf '%s\n' "$content" |
    sed -n 's/.*CURRENT_VERSION "\([^"]*\).*/\1/p'
)

そしてawk

extract_string=$(
  printf '%s\n' "$content" |
    awk -F'"' '/CURRENT_VERSION/{ print $2 }'
)

答え2

抽出するテキストは変数の内部にあるため、sed、awk、cutなどの外部コマンドを呼び出すと、実際に処理時間が無駄になります。

同等の正規表現を複数のシェル(ksh、bash、zsh)で使用できます。

re='CURRENT_VERSION "(.*)".*'
[[ $content =~ $re ]] && echo "${BASH_REMATCH[1]}"

シェルにこれらの機能がない場合は、次を使用します。

out1=${content#*\"}; out2=${out1%\"*}
[[ ${content} -ne ${#out1} ]] && 
    [[ ${#out1} -ne ${#out2} ]] &&
        echo "$out2"

最後のテストでは、どちらも"文字列に変更を作成したことを確認し、抽出された文字列のみを印刷します。

"これにより、最初と最後の間のテキストが出力されます"

答え3

cut以下を使用してこれを行うことができます。awk

content='#define CURRENT_VERSION "1.0.0.2" その他のランダムテキスト'

cut:

extract_string=$(echo $content|cut -d '"' -f2)

awk:

extract_string=$(echo $content|awk '{for(i=1;i<=NF;i++)if($i~/CURRENT_VERSION/)print $(i+1)}')

関連情報