簡體   English   中英

使用 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它返回以下字符串

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>//'

注意:-這是使用 cli 命令的Athena查詢

我錯過了替換邏輯中的任何內容嗎? 如有錯誤請指正

問題在於變量SQL的分配。 如果您執行echo $SQL ,您會看到該變量已經不包含 substring $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的方式會將任何空格壓縮到一個空格中。 您當前的 SQL 字符串沒有問題,但以后可能會咬到您。

如果您堅持使用sed來完成此任務,您可以引用參數來回顯,或者不要使用不必要的管道。 我會簡單地做一個

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

完成任務。 請注意,在任何情況下,您的sed方法僅在client_id不包含正則表達式字符時才有效,這可能會破壞替換。

SQL中轉義$client_id就像這樣\$client_id

或者如果可能的話,使用%%client_id%%類的東西

參考

如果當前字符是單引號或雙引號並且它沒有被引用,它將影響到引用文本末尾的后續字符的引用。

(資源)

只有外部引號不被引用,規則適用於它們。 內引號被引用,它們不影響后續字符

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM