我的字符串看起来像这样
string="xxxxx.yyyyy[2].zzzzz"
我想提取[ ]
. 我使用了以下awk
命令
echo $string | awk -F'[]' '{print $2}'
但是此awk
命令返回错误:
awk: bad regex '[]': Unmatched [ or [^
如何解决?
这应该有效:
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
使用 sed:
echo "xxxxx.yyyyy[2].zzzzz" | sed -r 's/.*\[(.*)\].*/\1/g'
使用 awk:
echo "xxxxx.yyyyy[2].zzzzz" | awk 'BEGIN {FS="[";RS="]"} {print $2}'
和grep
echo "xxxxx.yyyyy[2].zzzzz" | grep -oE '[0-9]'
2
这是一种更通用的方法。它将从文本文件中获取任意数字:
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