我有一串数字格式如下:
24_1_1_1_1_1_12_1_1_13_1_1
下划线是空格
我需要抓住 3 个数字。在这种情况下是第一个数字24,然后是以下两个之后的数字1's,在这种情况下它是一个1。然后再过两个1's就可以了12。我已经尝试了无数sed的解决方案来获得答案awk,grep但问题是所需的 3 个数字中的任何一个都可能是 1,2 或 3 位数字。
所以在这个例子中,我需要加粗的数字。
24 _1_1_ 1 _1_1_ 12 _1_1_13_1_1
我有一串数字格式如下:
24_1_1_1_1_1_12_1_1_13_1_1
下划线是空格
我需要抓住 3 个数字。在这种情况下是第一个数字24,然后是以下两个之后的数字1's,在这种情况下它是一个1。然后再过两个1's就可以了12。我已经尝试了无数sed的解决方案来获得答案awk,grep但问题是所需的 3 个数字中的任何一个都可能是 1,2 或 3 位数字。
所以在这个例子中,我需要加粗的数字。
24 _1_1_ 1 _1_1_ 12 _1_1_13_1_1
您可以将 $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]}
将字符串拆分为一个数组,然后遍历该数组:
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
下面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
使用读取:
read a x x b x x c x <<< "$str"
-
$ printf "%s\n" "$a" "$b" "$c"
24
1
12