2014-12-05 130 views

回答

3

Awk分隔符不是字符串,它们是“字段分隔符”(因此变量名为FS),它是一种具有一些附加功能的扩展正则表达式类型(例如,不包含在方括号内的单个空字符作为字段分隔符意味着所有连续的空白链都被分开,并且忽略每个记录上的前导和尾随空白)。

字符串,正则表达式和字段分隔符之间的区别非常重要,需要注意。你有时也会看到使用的“模式”这个词 - 不要使用这个词,它没有(或者可能有太多的意思)。

一个?是RE元字符,所以你需要告诉AWK不要被这些方法之一其视为这样你的情况:

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

你不严格需要做的第一个

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

但恕我直言,最好的清晰度和适应未来发展做吧:当它在一个RE的第一个字符?,因为它的元字符的功能是不适用的。

4

?是一个正则表达式元字符,这意味着在前原子zero or one matches。 (我很惊讶的awk没有抱怨的一个起步,但。)

尝试echo "=?utf-8?B?tralala" | awk -F '\\?B\\?' '{print $2 }'代替。

+2

('+'与以前的一个或多个原子相匹配。) – chepner 2014-12-05 17:31:25

+0

两个计数都正确。这是一个潦草的复制和粘贴,滑倒了一条线,我显然没有仔细阅读。 – 2014-12-05 17:32:21

+0

注意''''后'''''''作为一个不情愿的或非贪婪的量词。 – 2014-12-05 17:36:18

相关问题