yq:基於 Go 實現處理 YAML、JSON、XML、CSV、TOML 的命令行工具

在現代開發和運維的世界中,處理和轉換不同格式的數據文件如 YAML、JSON、XML、CSV 等是日常任務。文件格式的多樣性和複雜性常常給開發者帶來不小的挑戰。在這種情況下,強大的命令行工具能夠極大地簡化工作流程。本文將深入探討一個強大的多功能工具——go yq,它能夠便捷地處理 YAML、JSON、XML、CSV、TOML 以及屬性文件。

安裝 go yq

首先,我們需要安裝 go yq。以下是安裝步驟:

安裝 Go 編譯器

go yq 是用 Go 語言編寫的,因此你需要先安裝 Go 編譯器。可以通過以下步驟進行安裝:

# 更新包列表
sudo apt update

# 安裝 Go
sudo apt install golang-go

安裝 go yq

接下來,使用 Go 工具鏈下載並安裝 go yq

go install github.com/mikefarah/yq/v4@latest

安裝完成後,可以通過以下命令驗證:

yq --version

你應該會看到類似以下的輸出:

yq (https://github.com/mikefarah/yq/) version x.x.x

基本用法

go yq 可以處理多種文件格式,以下是一些常見的用法示例:

讀取 YAML 文件

假設有一個名爲 example.yaml 的 YAML 文件,內容如下:

name: John Doe
age: 30
address:
  city: ExampleCity
  zip: 12345

可以使用 yq 讀取這個文件的內容:

yq e . example.yaml

輸出將是:

name: John Doe
age: 30
address:
  city: ExampleCity
  zip: 12345

讀取 JSON 文件

假設有一個名爲 example.json 的 JSON 文件,內容如下:

{
  "name""John Doe",
  "age": 30,
  "address"{
    "city""ExampleCity",
    "zip"12345
  }
}

可以使用 yq 讀取這個文件的內容:

yq e -o=json . example.json

輸出將是:

{
  "name""John Doe",
  "age": 30,
  "address"{
    "city""ExampleCity",
    "zip"12345
  }
}

轉換格式

go yq 強大的一點在於它可以在多種格式之間轉換。比如,你可以將 YAML 文件轉換爲 JSON 文件:

yq e -o=json . example.yaml

類似地,可以將 JSON 文件轉換爲 YAML 文件:

yq e -o=yaml . example.json

編輯文件

可以使用 yq 編輯文件內容。以下演示如何修改 example.yaml 文件中的值:

yq e '.age = 31' -i example.yaml

修改後的 example.yaml 文件內容將是:

name: John Doe
age: 31
address:
  city: ExampleCity
  zip: 12345

查詢數據

有時我們只需要獲取文件中的某一部分數據,yq 提供了一種簡單的查詢方式。比如,可以查詢 example.yaml 文件中的 address 字段:

yq e '.address' example.yaml

輸出將是:

city: ExampleCity
zip: 12345

多文件處理

yq 還支持同時處理多個文件,比如合併兩個 YAML 文件:

假設有兩個文件 file1.yamlfile2.yaml,內容如下:

file1.yaml:

name: John Doe
age: 30

file2.yaml:

address:
  city: ExampleCity
  zip: 12345

可以使用以下命令將這兩個文件合併:

yq eval-all 'select(fileIndex == 0) * select(fileIndex == 1)' file1.yaml file2.yaml

輸出將是:

name: John Doe
age: 30
address:
  city: ExampleCity
  zip: 12345

使用嵌套命令

有時我們需要進行一些更復雜的操作,比如修改嵌套的值。假設我們需要修改 example.yaml 文件中 address.city 的值,可以使用嵌套命令:

yq e '.address.city = "NewCity"' -i example.yaml

修改後的文件內容將是:

name: John Doe
age: 30
address:
  city: NewCity
  zip: 12345

使用管道傳輸與其他命令組合

go yq 還可以與其他命令組合使用,充分利用管道傳輸數據。比如,可以結合 jq 命令處理 JSON 文件:

cat example.json | yq e -o=json '.' | jq '.name'

輸出將是:

"John Doe"

進階用法和擴展

自定義函數

go yq 支持自定義函數,我們可以在處理文件時執行自定義邏輯。以下是一個簡單的例子,創建一個自定義函數將所有字符串轉換爲大寫:

yq e 'def uppercase: map_values(if type == "!!str" then (. | upcase) else . end); . ' example.yaml

使用正則表達式

go yq 支持使用正則表達式進行復雜的過濾和替換操作。假設我們需要替換所有以 J 開頭的名字,可以使用以下命令:

yq e '(.name | select(. == "John Doe") | sub("John", "Jane"))' example.yaml

結合自動化工具

go yq 結合到自動化工具如 Makefile 或 CI/CD 管道中,可以極大地提升自動化程度和效率。例如,可以在 Makefile 中定義一個任務處理 YAML 文件:

process_yaml:
    yq e '.version += 1' -i example.yaml

在 CI/CD 管道中,可以使用如下步驟:

jobs:
  process_yaml:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Install yq
        run: go install github.com/mikefarah/yq/v4@latest
      - name: Process YAML
        run: yq e '.version += 1' -i example.yaml

總結

go yq 是一個強大而靈活的命令行工具,適用於處理多種文件格式如 YAML、JSON、XML、CSV、TOML 和屬性文件。通過本文的詳細講解和豐富的示例,希望你已經掌握了 go yq 的基本用法和進階技巧,並能在實際工作中靈活運用這個工具,提高工作效率。如果你對數據文件處理有更高的需求,可以進一步探索 go yq 的文檔和社區資源,挖掘更多高級特性。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/_YsuLRBIetOO22N_t5Bbow