我正在尝试使用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}'