Bash AWK检索令牌失败

Bash AWK检索令牌失败,bash,awk,gawk,Bash,Awk,Gawk,我正在尝试使用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也给

我正在尝试使用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也给出了同样的结果。

将特殊字符括在字符类中

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

将特殊字符括在字符类中

echo "sad ads ( this should come" | awk -F"[(] " '{print $2}'
“这背后的原因是什么?”

请注意以下工作(始终使用GNU awk):

但以下情况并非如此:

$ echo "sad ads ( this should come" | awk -F'\( ' '{print $2}'
awk: warning: escape sequence `\(' treated as plain `('
awk: fatal: Unmatched ( or \(: /( /
awk
不将
\(
识别为有效的转义序列,并用一个简单但不平衡的
)代替它。它接受
\\(
作为转义括号

解释说,Posix故意在常规字符前面出现反斜杠时不明确应该发生什么:

常规字符前的反斜杠

如果在字符串常量中,将反斜杠放在 先前列出的字符中没有一个是POSIX awk故意使用的 将发生的内容保留为未定义。有两种选择:

去掉反斜杠 这就是Brian Kernighan的awk和gawk所做的。例如,“a\qc”与“aqc”是相同的。(因为这是一个很容易找到的bug。) 介绍和错过,GAWK警告你。)考虑“FS=”。 \t] +\\\\;[\t]+“'使用由空格包围的竖条作为 字段分隔符。字符串中应该有两个反斜杠:“FS”= “[\t]+\\\124;[\ 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将
“\\”
视为一个反斜杠,但将
“\\'
视为两个反斜杠

“这背后的原因是什么?”

请注意以下工作(始终使用GNU awk):

但以下情况并非如此:

$ echo "sad ads ( this should come" | awk -F'\( ' '{print $2}'
awk: warning: escape sequence `\(' treated as plain `('
awk: fatal: Unmatched ( or \(: /( /
awk
不将
\(
识别为有效的转义序列,并用一个简单但不平衡的
)代替它。它接受
\\(
作为转义括号

解释说,Posix故意在常规字符前面出现反斜杠时不明确应该发生什么:

常规字符前的反斜杠

如果在字符串常量中,将反斜杠放在 先前列出的字符中没有一个是POSIX awk故意使用的 将发生的内容保留为未定义。有两种选择:

去掉反斜杠 这就是Brian Kernighan的awk和gawk所做的。例如,“a\qc”与“aqc”是相同的。(因为这是一个很容易找到的bug。) 介绍和错过,GAWK警告你。)考虑“FS=”。 \t] +\\\\;[\t]+“'使用由空格包围的竖条作为 字段分隔符。字符串中应该有两个反斜杠:“FS”= “[\t]+\\\124;[\ 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将
“\\\”
视为一个反斜杠,但将
“\\\”
视为两个反斜杠。

谢谢,但分隔符是“(”and“。如果我尝试相同的方法,它会将“ads”作为输出。
“echo”sad ads(应该是“;awk-F”[(]”{print$2}“ads
我认为您缺少空格。即使是
FS
也会在多个分隔符上出现相同的错误。
#echo”sad ads(这应该是“| awk-v FS=“”(“{print$2}”awk:fatal:不匹配(或\(:/Dinesh(//<代码> >在字符类之外放置一个空格,如果空间在里面,字符类将考虑<代码>(< /代码>或<代码>空间< /代码>。使用此:<代码>回声“悲伤广告”(这应该来)“GAWK-V FS=”[ [(] ] {打印2美元} } /代码>是的。它工作了。谢谢。但是,如果我使用“(),你能告诉我失败的原因吗?”但不是为了“)”@jaypal谢谢。但我的问题仍然存在!!它应该把
{
}
也当作一个特殊字符。但不是。无论如何……谢谢你的回答。谢谢,但分隔符是“(和)”。如果我尝试同样的方法,它会给出“ads”作为输出。
\echo“sad ads”(这应该会出现)|awk-F“[(]”“{print$2}”广告
我认为您缺少空格。即使是
FS
也会在多个分隔符中出现相同的错误。
"echo“sad ads(这应该是“{print$2}”awk:fatal:不匹配(或\(:/Dinesh(//<代码> >在字符类之外放置一个空格,如果空间在里面,字符类将考虑<代码>(< /代码>或<代码>空间< /代码>。使用此:<代码>回声“悲伤广告”(这应该来)“GAWK-V FS=”[ [(] ] {打印2美元} } /代码>是的。它工作了。谢谢。但是,如果我使用“(),你能告诉我失败的原因吗?”但不是因为“@jaypal谢谢。但我的问题仍然存在!!它应该把
{
}
也当作一个特殊字符。但不是。无论如何..谢谢你的回答。