使用 bash 从查询中替换变量中的字符串

Replace String in variable from a query using bash

我正在尝试使用 sed 替换查询中的字符串。它不会用值替换变量 使用以下代码

SQL="CREATE EXTERNAL TABLE <table name>( user_id string, file_name string, file_type string, count string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( 'escapeChar'='\', 'quoteChar'='\"', 'separatorChar'=',') STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://<bucket name>/<folder name>/$client_id/'";
FINALSQL=$(echo $SQL | sed -e "s/$client_id/$client_id/g") 

如果我打印 FINALSQL .它 return 下面的字符串

CREATE EXTERNAL TABLE <table name>( user_id string, file_name string, file_type string, count string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( 'escapeChar'='\', 'quoteChar'='"', 'separatorChar'=',') STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://<bucket name>/<folder name>//'

注意:-这是一个 Athena 使用 cli 命令的查询

我是否遗漏了替换逻辑中的任何内容? 如有错误请指正

in SQL escape $client_id 像这样$client_id

或者如果可能的话,在整个过程中使用 %%client_id%% 之类的东西

refer

If the current character is , single-quote, or double-quote and it is not quoted, it shall affect quoting for subsequent characters up to the end of the quoted text.

(source)

只有外引号没有被引用,规则适用于它们。内引号被引用,它们不影响后面的字符

问题出在变量的赋值上SQL。如果您执行 echo $SQL,您会看到该变量已经不包含子字符串 $client_id,因此没有任何内容被替换也就不足为奇了。

如果你设置为

SQL="CREATE EXTERNAL TABLE <table name>( user_id string, file_name string, file_type string, count string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( 'escapeChar'='\', 'quoteChar'='\"', 'separatorChar'=',') STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://<bucket name>/<folder name>/$client_id/'"

你的替换代码对我有用。

另一个次要的问题是,您使用 echo 的方式会将 space 中的任何 运行 压缩成一个 space。您当前的 SQL 字符串没有问题,但稍后可能会影响您。

如果您坚持使用 sed 完成此任务,您可以将参数引用到 echo,或者不要使用不必要的管道。我会简单地做一个

FINALSQL=$(sed -e "s/$client_id/$client_id/g" <<<$SQL)

完成任务。请注意,在任何情况下,您的 sed 方法仅在 client_id 不包含正则表达式字符时才有效,这可能会破坏替换。