BusyBoxで正規表現を使用して2つの文字列の間で文字列を抽出しようとしています。現地でできました。
extract_string=$(echo $content | grep -P '(?<=CURRENT_VERSION ")(.*)(?=")' -o)
残念ながら、このBusyBoxバージョンのgrep
コマンドはこの-P
オプションをサポートしていません。sed
、awk
およびを使用できます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)}')