我有一個 shell 腳本來從 YAML 檔案中讀取資料,然后進行一些處理。YAML 檔案是這樣的 -
view:
schema1.view1:/some-path/view1.sql
schema2.view2:/some-path/view2.sql
tables:
schema1.table1:/some-path/table1.sql
schema2.table2:/some-path/table2.sql
end
我希望輸出為 -
schema:schema1
object:view1
fileloc:/some-path/view1.sql
schema:schema2
object:view2
fileloc:/some-path/view2.sql
schema:schema1
object:table1
fileloc:/some-path/table1.sql
schema:schema2
object:table2
fileloc:/some-path/table2.sql
這就是我使用 shell 腳本讀取 YAML 檔案的方式 -
#!/bin/bash
input=./file.yaml
viewData=$(sed '/view/,/tables/!d;/tables/q' $file|sed '1d;$d')
tableData=$(sed '/tables/,/end/!d;/end/q' $file|sed '1d;$d')
所以 viewData 將有這個資料 -
schema1.view1:/some-path/view1.sql
schema2.view2:/some-path/view2.sql
和 tableData 將有這個資料 -
schema1.table1:/some-path/table1.sql
schema2.table2:/some-path/table2.sql
然后我使用 for 回圈來分離模式、物件和 SQL 檔案 -
for line in $tableData; do
field=`echo $line | cut -d: -f1`
schema=`echo $field | cut -d. -f1`
object=`echo $field | cut -d. -f2`
fileLoc=`echo $line | cut -d: -f2`
echo "schema=$schema"
echo "object=$object"
echo "fileloc=$fileLoc"
done
但是我必須再次為視圖做同樣的事情。在 shell 腳本中是否有任何方法,比如使用陣列或其他東西,以便我可以使用相同的回圈來獲取視圖和表的資料。
任何幫助,將不勝感激。謝謝!
uj5u.com熱心網友回復:
使用 (g)awk:
awk -F "[:.]" '/:$/{ s=$1 }{ gsub(" ",""); if($3!=""){ print "schema="$1; print "object="$2; print "fileloc="$3 }}' yaml
-F "[:.]"讀取輸入,并將其分隔為:or.(但使用正則運算式[:.].)/:$/{ s=$1 }這將存盤您當前正在閱讀的組(view或)。tables這不再使用,因此可以忽略。gsub(" ","");這將洗掉輸入行中的所有空格。if...當您有三個欄位時,由一個非空的第三個欄位檢查,列印資訊。
輸出:
schema=schema1
object=view1
fileloc=/some-path/view1
schema=schema2
object=view2
fileloc=/some-path/view2
schema=schema1
object=table1
fileloc=/some-path/table1
schema=schema2
object=table2
fileloc=/some-path/table2
編輯:添加objectType到輸出:
awk -F "[:.]" '/:$/{ s=$1 }{ gsub(" ",""); if($3!=""){ print "objectType="$s; "schema="$1; print "object="$2; print "fileloc="$3 }}' yaml
但我確實看到我犯了一個錯誤....????
我本來希望正則運算式/:$/找到以 a 結尾的行:,但由于某種原因它沒有。(我將不得不做更多的研究來調查)
對于一個可行的解決方法,它應該是:
awk -F "[:.]" 'NF==2{ s=$1 }NF>2{ gsub(" ",""); if($3!=""){ print "objectType="s; "sch
ema="$1; print "object="$2; print "fileloc="$3 }}' yaml
- with 的行
view:有兩個欄位,NF回傳值 2,并view存盤在變數 中s。 - 當我們有兩個以上的欄位時,列印變數的內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/535681.html
標籤:壳yaml
上一篇:避免捕獲相似的檔案夾名稱
