通过运行以下命令我得到字符串“utf-8” 我以为用这个命令我会把字符串“tralala”返回
echo "=?utf-8?B?tralala" | awk -F "?B?" '{print $2 }'
为什么? 我应该使用什么分隔符来获取字符串“tralala”?
答案 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
但恕我直言,最好还是为了清晰和面向未来而做到这一点。