Bash脚本中如何转义方括号、连字符等特殊符号?
如何在Bash脚本的Hive Here Document中转义正则特殊符号?
我明白你遇到的问题了——在Bash脚本的Hive Here Document里,正则表达式里的[、]、^这些符号总是被Bash错误解析,加单个反斜杠也没用对吧?这是因为Bash会把这些符号当作文件名通配符来处理,而不是直接传递给Hive。另外提个小细节:你的原脚本里SELECT语句末尾多了逗号,这会导致Hive语法错误,我在下面的示例里已经修正了~
下面给你几个可行的解决方案:
方案1:在特殊符号前加反斜杠(Bash层面转义)
你之前尝试加单个\无效,是因为在Here Document中,单个反斜杠会被Bash当作转义符吃掉。我们可以给每个特殊符号加一个反斜杠,让Bash把它们当作普通字符处理,最终传递给Hive的就是原始正则符号:
APP_ID="get_json_object(mobile_attributes, '$.id')" PLATFORM="parse_user_agent(user_agent, 'os')" hive << EOF INSERT OVERWRITE TABLE new_mobile_app_ids SELECT t.app_id FROM ( SELECT ${APP_ID} as app_id FROM sourcetable WHERE ${APP_ID} RLIKE CASE WHEN ${PLATFORM} = 'IOS' THEN '\[0-9\]' ELSE '\[\^0-9\]' END ) t; EOF
方案2:临时关闭Bash的通配符扩展
如果你的脚本里有很多正则符号,一个个加反斜杠太麻烦,可以临时关闭Bash的通配符(glob)扩展功能,执行完Hive命令再恢复,这样Bash就不会解析[]这类符号了:
APP_ID="get_json_object(mobile_attributes, '$.id')" PLATFORM="parse_user_agent(user_agent, 'os')" set -f # 关闭通配符扩展,Bash不再解析正则符号 hive << EOF INSERT OVERWRITE TABLE new_mobile_app_ids SELECT t.app_id FROM ( SELECT ${APP_ID} as app_id FROM sourcetable WHERE ${APP_ID} RLIKE CASE WHEN ${PLATFORM} = 'IOS' THEN '[0-9]' ELSE '[^0-9]' END ) t; EOF set +f # 恢复通配符扩展,不影响后续脚本执行
这个方法最省心,不需要修改Hive语句里的正则内容。
方案3:使用占位符替换(彻底隔离解析逻辑)
如果想彻底避免Bash和Hive的解析冲突,可以先写带占位符的Hive语句,再手动替换变量:
APP_ID="get_json_object(mobile_attributes, '$.id')" PLATFORM="parse_user_agent(user_agent, 'os')" # 用占位符写Hive语句,这里的EOF加单引号,Bash不会解析任何内容 HIVE_SCRIPT=$(cat <<'EOF' INSERT OVERWRITE TABLE new_mobile_app_ids SELECT t.app_id FROM ( SELECT __APP_ID__ as app_id FROM sourcetable WHERE __APP_ID__ RLIKE CASE WHEN __PLATFORM__ = 'IOS' THEN '[0-9]' ELSE '[^0-9]' END ) t; EOF ) # 替换占位符为实际变量 HIVE_SCRIPT=${HIVE_SCRIPT//__APP_ID__/$APP_ID} HIVE_SCRIPT=${HIVE_SCRIPT//__PLATFORM__/$PLATFORM} # 执行Hive脚本 echo "$HIVE_SCRIPT" | hive
这种方法完全隔离了Bash和Hive的解析逻辑,适合复杂的Hive脚本场景。
内容的提问来源于stack exchange,提问作者Ahmad
相关产品推荐
相关产品推荐

