我需要从字符串中提取数字

时间:2016-10-20 06:23:28

标签: bash shell unix

使用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

Archive是具有存储"7"等文件的子目录的目录的路径。我删除了下划线并根据它的出现对文件进行了排序。然后我尝试仅提取出现次数"27" private void checkBox1_CheckedChanged(object sender, EventArgs e) { if (checkBox1.Checked == true) { //iterate list box items on a thread-pool thread using TPL Task.Run(() => Play()); } } private void Play() { //listBox1 is the name of the list box control in my windows forms application foreach (var listboxItem in listBox1.Items) { //check if the checkbox is currently in checked state if(checkBox1.Checked) { //Checkbox is checked so process the listbox item Console.WriteLine(listboxItem.ToString()); //do other required stuff } else break; } }

8 个答案:

答案 0 :(得分:3)

bash参数展开:

${var%%[[:alpha:]]*}
  • 我们贪婪地从右边(%%)删除子串,从末尾到第一个字母([[:alpha:]]*)字符(左起)。

示例:

$ var='7prob542334'

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

$ var='27prob542334'

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

答案 1 :(得分:3)

使用bash自己的regex匹配,([[:digit:]]+)(.*)

$ 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 :(得分:2)

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

echo 17prob542334 |grep -oP  '^\d*'
17

答案 3 :(得分:2)

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

OR

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

答案 4 :(得分:1)

在awk中:

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

击:

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

答案 5 :(得分:1)

使用awk,您可以使用printf命令,该命令只接受参数中给出的字符串的小数部分:

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

答案 6 :(得分:1)

如果Perl是一个选项:

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

输出:

27

答案 7 :(得分:0)

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