强调文字我有一些文字,如
CreateMainPageLink("410",$objUserData,$mnt[139]);
我希望在139
mnt
gawk
之后从中提取数字pipe
。我尝试了以下表达式(在grep
表达式中用于gawk '{FS="[\[\]]";print NF}'
的结果
[
打印字段数。如果我的字段分隔符是]
和3
,我希望看到打印出的数字gawk: warning: escape sequence `\[' treated as plain `['
gawk: warning: escape sequence `\]' treated as plain `]'
(三个字段;一个在打开的矩形括号之前,一个在之后,以及我想要的实际数字)提取)。我得到的是一个字段,对应于整行,以及两个警告:
gawk '{FS="[]"}{print NF;}'
gawk: (FILENAME=- FNR=1) fatal: Unmatched [ or [^: /[]/
我正在关注给定here的示例,但显然我的表达式存在一些问题/错误。
使用以下两个表达式也不起作用:
gawk '{FS="\[\]"}{print NF;}'
gawk: warning: escape sequence `\[' treated as plain `['
gawk: warning: escape sequence `\]' treated as plain `]'
gawk: (FILENAME=- FNR=1) fatal: Unmatched [ or [^: /[]/
和
{{1}}
答案 0 :(得分:1)
gawk -F [] []'{print $ 0“ - >”$ 1“\ t”$ 2; }“
$ gawk -F[][] '{ print $0" -> "$1"\t"$2; }'
titi[toto]tutu
titi[toto]tutu -> titi toto
1)您必须在进入主解析循环之前设置FS
。你可以这样做:
awk 'BEGIN { FS="[\\[\\]]"; } { print $0" -> "$1"\t"$2; }'
在解析文件之前执行BEGIN
子句。
我必须两次转义[
字符:一,因为它在引用的字符串中。而另一次因为gawk在括号表达式中强制要求它。
我个人更喜欢使用不那么详细的-F
标志。
2)FS="[\[\]]"
是错误的,因为你在一个带引号的字符串里面,这就转义了字符串里面的字符。 Awk会看到:[[]]
这是一个无效的括号表达式。
3)FS="[]"
错误,因为它是一个空括号表达式试图匹配任何内容
4)FS="\[\]"
再次出错,因为错误2)和3)在一起:))
gawk手册说:The regular expressions in awk are a superset of the POSIX specification
。这就是您可以使用[\\[\\]]
或[][]
的原因。后来是posix方式。
要在列表中包含文字']',请将其设为第一个字符
见:
答案 1 :(得分:1)
FS="[]"
此处查找[]
内的数据,但没有。
要使用方括号,您需要像[][]
这也是错误的gawk '{FS="[\[\]]";print NF}'
你需要FS作为表达式之外的变量。
EKS
echo 'CreateMainPageLink("410",$objUserData,$mnt[139]);' | awk -F[][] '{print $2}'
139
或者
awk '{print $2}' FS=[][]
或者
awk 'BEGIN {FS="[][]"} {print $2}'
全部给出139
修改:gawk '{FS="[\[\]]";print NF}'
您可以在此处打印字段数NF
,而不是$NF
的值。无论如何它都无济于事,因为将数据与[]
分开会在上次提交时提供);
,请使用此awk '{print $(NF-1)}' FS=[][]
获取倒数第二个。
答案 2 :(得分:0)
您需要awk
吗?您可以通过sed
获取价值:
# echo 'CreateMainPageLink("410",$objUserData,$mnt[139]);' | sed -n 's:.*\[\([0-9]\+\)\].*:\1:p'
139