AWK检索令牌失败



我正在尝试使用awk获取令牌。但是awk不适用于分隔符"("。为什么会发生这种情况?

echo "sad ads ( this should come" | awk -F"( " '{print $2}'
awk: fatal: Unmatched ( or (: /( /

但如果用")"试试,它是有效的。

echo "sad ads ) this should come" | awk -F") " '{print $2}'
this should come

这背后的原因是什么?gawk也给出了同样的结果。

"这背后的原因是什么?">

注意以下工作(GNU awk贯穿始终):

$ echo "sad ads ( this should come" | awk -F'\( ' '{print $2}'
this should come

但以下情况并非如此:

$ echo "sad ads ( this should come" | awk -F'( ' '{print $2}'
awk: warning: escape sequence `(' treated as plain `('
awk: fatal: Unmatched ( or (: /( /

CCD_ 1不将CCD_ 2识别为有效的转义序列,并用简单但不平衡的CCD_ 它确实接受'\('作为转义括号。

gawk文档解释说,Posix故意对规则字符前出现反斜杠时应该发生的事情含糊其辞:

规则字符前的反斜杠

如果在字符串常量中,在不是前面列出的字符之一,POSIX故意awk留下未定义的结果。有两种选择:

去掉反斜杠这就是Brian Kernighan的awk和gawk的作用。例如,"a\\qc"与"aqc"相同。(因为这是一个很容易的错误介绍和错过,gawk警告你。)考虑"FS="[\t] +\|[\t]+"'使用由空格包围的竖线作为字段分隔符。字符串中应该有两个反斜杠:'FS="[\t]+\|[\t]+"'。)

不要使用反斜杠其他一些awk实现可以做到这一点。在这样的实现中,键入"a\qc"与键入"a\\qc"是相同的。

(不是一个正则字符,但显然,gawk根据前一种情况处理它。

shell和awk的交互还有一个单独的问题。请注意,下面的两个命令仅在使用单引号和双引号方面有所不同:

$ echo "sad ads ( this should come" | awk -F'\( ' '{print $2}'
this should come
$ echo "sad ads ( this should come" | awk -F"\( " '{print $2}'
awk: warning: escape sequence `(' treated as plain `('
awk: fatal: Unmatched ( or (: /( /

shell将"\"视为一个反斜杠,而将'\'视为两个反斜杠。

将特殊字符封装在字符类中

echo "sad ads ( this should come" | awk -F"[(] " '{print $2}'

相关内容

  • 没有找到相关文章

最新更新