2016-10-20 11 views
0

を使用してください。bash文字列の前の数字だけを抽出しようとしています。例えば文字列から数字を抽出する必要があります

7prob542334 

予想される出力:

7 

しかし、私は私が持っているエラーに遭遇

27prob542334 

予想される出力:

27 

代わりに私が2

これを取得し、私がこれまで持っているコード:

max=$(ls -LR $ARCHIVE | grep ^prob | sed 's/_.*//' | uniq -c | sort -rn | tr -d ' '| head -n1 | head -c1) 

アーカイブprob542334_05のようなファイルを格納するサブディレクトリとディレクトリへのパスです。私はアンダースコアを削除し、その発生に基づいてファイルをソートしました。それから私はbashパラメータ展開で"7"または"27"

+0

たくさん/ ParsingLs)、 'uniq'をおそらくソートされていない入力などで使用しています...すべての引用パターンに良いアイデア' grep 'のために 'prob'' – Sundeep

+0

完全な質問が何であるかを記述することができれば、[xy問題](http://meta.stackexchange.com/questions/66377/what-is-the-x ...)も参照してください:https://stackoverflow.com/help/mcve – Sundeep

答えて

3

のようなだけ出現数を抽出してみてください。

${var%%[[:alpha:]]*} 
  • 我々は貪欲端から最初のアルファベット([[:alpha:]]*)に、右(%%)から部分を削除します文字(左から)。

例:

$ var='7prob542334' 

$ echo "${var%%[[:alpha:]]*}" 
7 

$ var='27prob542334' 

$ echo "${var%%[[:alpha:]]*}" 
27 
+1

もっと一般的には、次のように書くことができます: '$ {var %% [^ [:digit:]] *}' - *非数字*およびそれに続くすべての文字 –

2
echo 127prob542334 |grep -o '^[0-9]*' 
127 

echo 17prob542334 |grep -oP '^\d*' 
17 
2
echo 127prob542334 | grep -o -E '[0-9]+' | head -1 | sed -e 's/^0\+//' 

OR

echo 127prob542334 | grep -o '^[0-9]*' 
+1

後者は動作しません。 –

+0

申し訳ありませんが引用符を逃しました –

+0

はい。私はこの方法をチェックします –

3

([[:digit:]]+)(.*)

と、 bash自身 regexマッチングを使用awkでは
$ string="7prob542334" 
$ [[ $string =~ ([[:digit:]]+)(.*) ]] && num=${BASH_REMATCH[1]} 
$ printf "%s\n" "$num" 
7 

$ string="27prob542334" 
$ [[ $string =~ ([[:digit:]]+)(.*) ]] && num=${BASH_REMATCH[1]} 
$ printf "%s\n" "$num" 
27 
+2

残りの文字列をキャプチャする必要はありません: '[[$ string =〜^([[digit:]] +)。*]]' –

0
echo '27prob542334' |grep -Po '^\d+' 
+0

このコードは、問題は、質問に答えて_why_および/または_how_を説明しません。この追加の文脈を提供することは、長期的な教育的価値を大幅に改善するだろう。どのような制限や仮定が適用されるかなど、あなたの答えを解説してください。 –

1

$ echo 127prob542334|awk 'sub(/[^0-9].*/,"") || 1' 
127 

バッシュ:awk

$ i=127prob542334 
$ echo ${i%%[^0-9]*} 
127 
1

は、あなただけ与えられた文字列の小数部分を取るprintfコマンドを利用することができます引数:

echo "127prob542334" | awk '{printf "%d\n",$1}' 
1

Perlはオプションの場合:

echo 27prob542334 | perl -lne 'print $1 if /^(\d+)/'

出力:な[ParsingLs](http://mywiki.wooledge.orgとしてあなたのコードと他の問題の

27

関連する問題