Big Chef

A Go-based tool for modifying XML, JSON, and text documents using XPath/JSONPath/Regex expressions and Lua transformations.

Features

  • Multi-Format Processing:
    • XML (XPath)
    • JSON (JSONPath)
    • Text (Regex)
  • Node Value Modification: Update text values in XML elements, JSON properties or text matches
  • Attribute Manipulation: Modify XML attributes, JSON object keys or regex capture groups
  • Conditional Logic: Apply transformations based on document content
  • Complex Operations:
    • Mathematical calculations
    • String manipulations
    • Date conversions
    • Structural changes
    • CSV/TSV parsing with comments and headers
    • Whole ass Lua environment
  • Error Handling: Comprehensive error detection for:
    • Invalid XML/JSON
    • Malformed XPath/JSONPath
    • Lua syntax errors

Usage Examples

1. Basic field modification

<!-- Input -->
<price>44.95</price>

<!-- Command -->
chef -xml "//price" "v=v*2" input.xml

<!-- Output -->
<price>89.9</price>

2. Supports glob patterns

chef -xml "//price" "v=v*2" data/**.xml

3. Attribute Update

<!-- Input -->
<item price="10.50"/>

<!-- Command -->
chef -xml "//item/@price" "v=v*2" input.xml

<!-- Output --> 
<item price="21"/>

3. JSONPath Transformation

// Input
{
  "products": [
    {"name": "Widget", "price": 19.99},
    {"name": "Gadget", "price": 29.99}
  ]
}

// Command
chef -json "$.products[*].price" "v=v*0.75" input.json

// Output
{
  "products": [
    {"name": "Widget", "price": 14.99},
    {"name": "Gadget", "price": 22.49}
  ]
}

4. Regex Text Replacement

Regex works slightly differently, up to 12 match groups are provided as v1..v12 and s1..s12 for numbers and strings respectively. A special shorthand "!num" is also provided that simply expands to (\d*\.?\d+).

<!-- Input -->
<description>Price: $15.00 Special Offer</description>

<!-- Command -->
chef "Price: $!num Special Offer" "v1 = v1 * 0.92" input.xml

<!-- Output -->
<description>Price: $13.80 Special Offer</description>

5. Conditional Transformation

<!-- Input -->
<item stock="5" price="10.00"/>

<!-- Command -->
chef -xml "//item" "if tonumber(v.stock) > 0 then v.price = v.price * 0.8 end" input.xml

<!-- Output -->
<item stock="5" price="8.00"/>

6. CSV/TSV Processing

The Lua environment includes CSV parsing functions that support comments, headers, and custom delimiters.

-- Basic CSV parsing
local rows = fromCSV(csvText)

-- With options
local rows = fromCSV(csvText, {
    delimiter = "\t",        -- Tab delimiter for TSV (default: ",")
    hasHeaders = true,       -- First row is headers (default: false)
    hasComments = true       -- Filter lines starting with # (default: false)
})

-- Access by index
local value = rows[1][2]

-- Access by header name (when hasHeaders = true)
local value = rows[1].Name

-- Convert back to CSV
local csv = toCSV(rows, "\t")  -- Optional delimiter parameter

Example with commented TSV file:

-- Input file:
-- #mercenary_profiles
-- Id	Name	Value
-- 1	Test	100
-- 2	Test2	200

local csv = readFile("mercenaries.tsv")
local rows = fromCSV(csv, {
    delimiter = "\t",
    hasHeaders = true,
    hasComments = true
})

-- Access data
rows[1].Name  -- "Test"
rows[2].Value -- "200"

Lua Helper Functions

The Lua environment includes many helper functions:

Math Functions

  • min(a, b), max(a, b) - Min/max of two numbers
  • round(x, n) - Round to n decimal places
  • floor(x), ceil(x) - Floor/ceiling functions

String Functions

  • upper(s), lower(s) - Case conversion
  • trim(s) - Remove leading/trailing whitespace
  • format(s, ...) - String formatting
  • strsplit(inputstr, sep) - Split string by separator

CSV Functions

  • fromCSV(csv, options) - Parse CSV/TSV text into table of rows
    • Options: delimiter (default: ","), hasHeaders (default: false), hasComments (default: false)
  • toCSV(rows, delimiter) - Convert table of rows back to CSV text

Conversion Functions

  • num(str) - Convert string to number (returns 0 if invalid)
  • str(num) - Convert number to string
  • is_number(str) - Check if string is numeric

Table Functions

  • isArray(t) - Check if table is a sequential array
  • dump(table, depth) - Print table structure recursively

HTTP Functions

  • fetch(url, options) - Make HTTP request, returns response table
    • Options: method, headers, body
    • Returns: {status, statusText, ok, body, headers}

Regex Functions

  • re(pattern, input) - Apply regex pattern, returns table with matches

Installation

go build -o chef main.go
# Process XML file
./chef -xml "//price" "v=v*1.2" input.xml

# Process JSON file 
./chef -json "$.prices[*]" "v=v*0.9" input.json
Description
No description provided
Readme 617 KiB
v7.4.1 Latest
2025-11-15 17:10:24 +00:00
Languages
Go 87%
Lua 12.6%
Shell 0.4%