为什么我不能在awk中用作分隔符"?B?"

时间:2014-12-05 17:20:08

标签: awk

通过运行以下命令我得到字符串“utf-8” 我以为用这个命令我会把字符串“tralala”返回

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

为什么? 我应该使用什么分隔符来获取字符串“tralala”?

2 个答案:

答案 0 :(得分:4)

?是一个正则表达式元字符,表示前面原子的zero or one matches。 (我很惊讶,awk并没有在开始时抱怨那个,但是。)

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

答案 1 :(得分: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

对于第一个?,您并不一定非常需要这样做,因为当它是RE中的第一个字符时,它的元字符功能不适用:

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

但恕我直言,最好还是为了清晰和面向未来而做到这一点。