为什么我能';t在awk中用作分隔符字符串“?”;?B?“;

为什么我能';t在awk中用作分隔符字符串“?”;?B?“;,awk,Awk,通过运行以下命令,我得到了字符串“utf-8” 我想用这个命令可以返回字符串“tralala” echo "=?utf-8?B?tralala" | awk -F "?B?" '{print $2 }' 为什么呢? 我应该使用什么分隔符来获取字符串“tralala”??是一个regex元字符,表示前面原子的零或一个匹配项。(我很惊讶awk一开始并没有抱怨这个问题,但是) 请尝试使用echo“=?utf-8?B?tralala”| awk-F'\\?B\\?“{print$2}”。awk分隔符不

通过运行以下命令,我得到了字符串“utf-8” 我想用这个命令可以返回字符串“tralala”

echo "=?utf-8?B?tralala" | awk -F "?B?" '{print $2 }'
为什么呢?
我应该使用什么分隔符来获取字符串“tralala”?

是一个regex元字符,表示前面原子的
零或一个匹配项。(我很惊讶awk一开始并没有抱怨这个问题,但是)


请尝试使用
echo“=?utf-8?B?tralala”| awk-F'\\?B\\?“{print$2}”

awk分隔符不是字符串,而是“字段分隔符”(因此名为
FS
),它是一种具有一些附加功能的扩展正则表达式(例如,当不在方括号内时,作为字段分隔符的单个空白字符意味着由所有连续的空格链分隔,并忽略每条记录上的前导和尾随空格)

字符串、正则表达式和字段分隔符之间的区别非常重要。您有时也会看到使用了“模式”一词-不要使用该术语,它没有(或可能有太多)含义

是一个重元字符,因此您需要告诉awk,在您的情况下,不要通过以下任一方法将其视为重元字符:

$ echo "=?utf-8?B?tralala" | awk -F '[?]B[?]' '{print $2}'
tralala
$ echo "=?utf-8?B?tralala" | awk -F '\\?B\\?' '{print $2}'
tralala
对于第一个
,您不需要严格执行此操作,因为当它是RE中的第一个字符时,它的元字符功能不适用:

$ echo "=?utf-8?B?tralala" | awk -F '?B[?]' '{print $2}'
tralala
$ echo "=?utf-8?B?tralala" | awk -F '?B\\?' '{print $2}'
tralala

但我认为,为了清晰和将来的证明,最好还是这样做。

+
与前面的一个或多个atom匹配。)这两个方面都是正确的。这是一个草率的复制和粘贴,漏掉了一行,我显然读得不够仔细。请注意,
+
*
之后的
充当了一个不情愿或不贪婪的量词。@AvinashRaj仅适用于perl兼容或类似版本。@hustphrr正确,非贪婪的东西与wk.Etan-在RE的开头有一个
,没有什么错,因为标准明确定义它在那个位置没有元字符功能,就像
*
+
等等。所以它只是一个文字问号字符。