2

我的字符串看起来像这样

string="xxxxx.yyyyy[2].zzzzz"

我想提取[ ]. 我使用了以下awk命令

echo $string | awk -F'[]' '{print $2}'

但是此awk命令返回错误:

awk: bad regex '[]': Unmatched [ or [^

如何解决?

4

4 回答 4

6

这应该有效:

echo "xxxxx.yyyyy[2].zzzzz" | awk -F '[][]' '{print $2}'
2

字符类中的]before顺序在这里很重要。[

这也可以通过双重转义[]使用交替正则表达式来工作:

echo "xxxxx.yyyyy[2].zzzzz" | awk -F '\\[|\\]' '{print $2}'
2

或者:

echo "xxxxx.yyyyy[2].zzzzz" | awk -F '[\\[\\]]' '{print $2}'
2
于 2014-11-06T11:06:01.763 回答
0

使用 sed:

echo "xxxxx.yyyyy[2].zzzzz" | sed -r 's/.*\[(.*)\].*/\1/g'

使用 awk:

 echo "xxxxx.yyyyy[2].zzzzz" | awk 'BEGIN {FS="[";RS="]"} {print $2}'
于 2014-11-06T11:10:49.147 回答
0

grep

echo "xxxxx.yyyyy[2].zzzzz" | grep -oE '[0-9]'

2
于 2014-11-06T11:14:09.380 回答
0

这是一种更通用的方法。它将从文本文件中获取任意数字:

echo "xxxxx.yyyyy[2].zzzzz" | awk -F "[^0-9]*" '{for (i=2;i<=NF;i++) printf "%s%s",$i,(i==NF?RS:" ")}'
2

其他示例

cat file
"C 56","Home athletics center","LAC"
"D001","50M Run","50M"
"D003","10.505M Run","100M","42K"

awk -F "[^0-9.]*" '{for (i=2;i<=NF;i++) printf "%s%s",$i,(i==NF?RS:" ")}' file
56
001 50 50
003 10.505 100 42
于 2014-11-06T11:26:17.657 回答