文字列変数から2番目の単語を抽出する


11

"rtcpOnNbActive true"変数に文字列を格納していますx。「true」を部分文字列として抽出して変数に格納したい。これどうやってするの?


x抽出する部分文字列の直前に常にスペースがありますか?
PM 2Ring 14

回答:


21

この方法を試してください:

y=$(echo $x | awk '{print $2}')
echo $y
  • echo $xの値を表示しますx
  • awk '{print $2}'以前に表示されたの2番目のフィールドを印刷しますx
  • $(... )出力を保持し、それをに割り当てyます。

3
echo $xされていない の値を表示しますxprintf '%s\n' "$x"だろう。
ステファンChazelas

2
awk '{print $2}'以前に表示された各行の2番目のフィールド印刷しますx
ステファンChazelas

9

抽出する部分文字列の前にスペースが少なくとも1つある(そして、部分文字列にスペースが含まれていない)と仮定すると、単純なパラメーター展開でこれを行うことができます。

x="rtcpOnNbActive     true"
y="${x##* }"
echo "[$y]"

出力

[true]

3
echo-始まらず、エスケープシーケンスを含まないリテラル文字列以外には移植できません。その動作は、それがどのようにコンパイルされたか、およびXPG_ECHOが設定されているかどうかによって、bash組み込みの場合でも異なります。文字列にエスケープシーケンスが含まれていないと仮定すると、これは問題ないはずですが、printf '[%s]\n' "$y"それでも優れています。
nyuszika7h 14

1
@ nyuszika7h:良い点、そしてStéphaneChazelasを読んだ後、ここや他の最近の質問で同様のことを言ったので、このような「使い捨てecho」の例でも、変数の値を表示するために使用する習慣を本当に破るべきです。
PM 2Ring 2014

4

あなたはawkを使うことができます:

echo "rtcpOnNbActive         true" | awk '{print $NF}'
true

NF 現在のレコードのフィールド数

sedの使用:

echo "rtcpOnNbActive         true" | sed 's/.* //g'
true

文字列式を使用:

 a="rtcpOnNbActive         true"
 echo ${a##* }
 true

grepを使用:

 echo "rtcpOnNbActive         true" | grep -Eo "[a-z]+$"
 true

-oは完全一致のみを提供し[a-z]+、azからの文字に一致し、$最後に意味します


2
同じ質問に他の回答の内容を投稿しないでください。
αғsнιη

1
他の人は何を答えますか????
Hackaholic 2014

彼はそれを変数に保存できますが、ここでは大したことではありません
Hackaholic

echo-始まらず、エスケープシーケンスを含まないリテラル文字列以外には移植できません。その動作は、それがどのようにコンパイルされたか、およびXPG_ECHOが設定されているかどうかによって、bash組み込みの場合でも異なります。また、変数の展開とコマンドの置換は常に二重引用符で囲む必要があります(特定の例外はありますが、必要ない場合でも害はありません)。OPのような文字列の場合、これは問題ないはずですが、確認しprintf '%s\n' "${a##* }"たい場合はより良いでしょう。
nyuszika7h 2014

3

そのためにbash配列を使用することが可能です。例:

arr="(first second third)"
echo ${arr[1]}

2

あなたは使用することができreadビルトインを

read -r _ y <<<"$x"
printf "%s\n" "$y"
true

なぜ関与するのreadですか?それはread分割を行うものではありません-それはそうです$IFS。何らかの理由で、多くの人が関与している場合に$IFS のみ w /を分割しても問題ないと考えてreadいます。あなたはただ行うことができます:set -f; IFS=' '; printf %.0s%s $xまたは何でも。いずれにせよ- $IFSここでの値を指定する必要があります。
mikeserv 2014

@mikeserv、readを使用して分割を行っていますドキュメントをIFS確認してください。readを使用する主な利点は、変数を設定し(これはOPの要件です)、文字列を分割して配列に入力できることを考えると、文字列から任意のフィールドを抽出するのに適しています。さらに、ここではデフォルトを想定していますが、必要に応じて設定するのは簡単です。トリックを行いますIFSIFS=$' \n\t' read -r _ y <<<"$x"
iruvar

いいえ、ちがいます。read割り当て、$IFS分割。配列にデータを入力する場合は、次を使用しsetます。その場合、ここでは人工的なhere-stringナンセンスは必要ありません。unset IFSデフォルトの$ IFS動作を取得します。
mikeserv 2014

@mikeserv、あなたは私のクリスマスカードリストから外れています。
iruvar

ええと。クリスマスは吸盤用です。
mikeserv 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.