22

文字列にパスが含まれています

string="toto.titi.12.tata.2.abc.def"

この文字列から数字だけを抽出したい。

最初の数値を抽出するには:

tmp="${string#toto.titi.*.}"
num1="${tmp%.tata*}"

2 番目の数値を抽出するには:

tmp="${string#toto.titi.*.tata.*.}"
num2="${tmp%.abc.def}"

したがって、パラメーターを抽出するには、2 つのステップで行う必要があります。ワンステップで数値を抽出する方法は?

4

10 に答える 10

12

すべての個々の数字を抽出し、行ごとに 1 つの数字の単語を出力するには、パイプを介して -

tr '\n' ' ' | sed -e 's/[^0-9]/ /g' -e 's/^ *//g' -e 's/ *$//g' | tr -s ' ' | sed 's/ /\n/g'

壊す:

  • すべての改行をスペースに置き換えます。tr '\n' ' '
  • 数字以外のすべてをスペースに置き換えます。sed -e 's/[^0-9]/ /g'
  • 先頭の空白を削除します:-e 's/^ *//g'
  • 末尾の空白を削除します。-e 's/ *$//g'
  • スペースを順番に 1 つのスペースにスクイーズします。tr -s ' '
  • 残りのスペース区切りを改行に置き換えます。sed 's/ /\n/g'

例:

echo -e " this 20 is 2sen\nten324ce 2 sort of" | tr '\n' ' ' | sed -e 's/[^0-9]/ /g' -e 's/^ *//g' -e 's/ *$//g' | tr -s ' ' | sed 's/ /\n/g'

印刷します

20
2
324
2
于 2015-05-27T18:28:55.227 に答える
5

パラメーターの拡張は、その日の順序のようです。

$ string="toto.titi.12.tata.2.abc.def"
$ read num1 num2 <<<${string//[^0-9]/ }
$ echo "$num1 / $num2"
12 / 2

もちろん、これは の形式に依存します$string。しかし、少なくともあなたが提供した例では、うまくいくようです。

これは、サブシェルを必要とする anubhava の awk ソリューションよりも優れている可能性があります。私もchepnerのソリューションが好きですが、正規表現はパラメーター展開よりも「重い」です(明らかにはるかに正確ですが)。(上記の式では、正規表現アトムのように見える[^0-9]かもしれませんが、そうではないことに注意してください。)

このフォームまたはパラメーター拡張については、bash の man ページを参照してください。${string//this/that}(<<<および ) はバシズムであり、従来の Bourne または posix シェルと互換性がないことに注意してください。

于 2015-03-10T15:38:14.663 に答える
2

取得しようとしている出力を正確に提供した場合、これは簡単に答えることができます。文字列から数字だけを取得し、それ以外はすべて削除する場合は、次のようにします。

d@AirBox:~$ string="toto.titi.12.tata.2.abc.def"
d@AirBox:~$ echo "${string//[a-z,.]/}"
122

少し明確にすれば、私はもっと助けることができるかもしれません。

于 2013-07-26T15:00:45.913 に答える
2

sed を使用することもできます。

echo "toto.titi.12.tata.2.abc.def" | sed 's/[0-9]*//g'

ここでは、sed が置き換えられます

  • 任意の数字 (クラス[0-9])
  • 何度でも繰り返す ( *)
  • 何もない (2 番目と 3 番目の間に何もない/)、
  • グローバルのg略です。

出力は次のようになります。

toto.titi..tata..abc.def
于 2013-07-29T13:46:32.253 に答える
1

正規表現マッチングを使用します。

string="toto.titi.12.tata.2.abc.def"
[[ $string =~ toto\.titi\.([0-9]+)\.tata\.([0-9]+)\. ]]
# BASH_REMATCH[0] would be "toto.titi.12.tata.2.", the entire match
# Successive elements of the array correspond to the parenthesized
# subexpressions, in left-to-right order. (If there are nested parentheses,
# they are numbered in depth-first order.)
first_number=${BASH_REMATCH[1]}
second_number=${BASH_REMATCH[2]}
于 2013-07-26T19:07:31.633 に答える