有条件地匹配字符串中的数字

时间:2013-03-09 19:34:22

标签: bash shell awk grep pattern-matching

我有一串数字格式如下:

  

24_1_1_1_1_1_12_1_1_13_1_1

下划线为空格

我需要抓3个号码。在这种情况下的第一个数字24,然后是后面两个1's之后的数字,在这种情况下它是1。然后另外两个1's将是12。我尝试了很多sedawkgrep解决方案来获得答案,但问题是任何所需的3个数字都可能是1,2或3位数。

所以在这个例子中我需要粗体数字。

  

24 _1_1_的 1 _1_1_的 12 _1_1_13_1_1

4 个答案:

答案 0 :(得分:2)

您可以将$ IFS设置为_并将字符串拆分为数组:

#!/bin/bash
string=24_1_1_1_1_1_12_1_1_13_1_1
OIFS=$IFS
IFS=_
ar=($string)
IFS=$OIFS
echo ${ar[0]} ${ar[3]} ${ar[6]}

答案 1 :(得分:1)

将字符串拆分为数组,然后迭代数组:

str="24_1_1_1_1_1_12_1_1_13_1_1"
IFS="_" read -ra numbers <<< "$str"
results=( ${numbers[0]} )
take_next=0
for n in "${numbers[@]:1}"; do
    if (( take_next == 2 )); then
        results+=( $n )
        take_next=0
    elif (( n == 1 )); then
        (( take_next++ ))
    else
        take_next=0
    fi
    (( ${#results[@]} == 3 )) && break
done

答案 2 :(得分:0)

以下awk单行如何打印第一个字段,然后打印两个字段后的每个字段:

$ awk 'NR==1||c==2{print;c=0;next}$1==1{c++}' RS=_ file
24
1
12
13

如果您想在一定数量的比赛后退出(例如3)

$ awk 'NR==1||c==2{print;c=0;m++;next}$1==1{c++}m==3{exit}' RS=_ file
24
1
12

答案 3 :(得分:0)

使用阅读:

read a x x b x x c x <<< "$str"

-

$ printf "%s\n" "$a" "$b" "$c"
24
1
12