3bcc958dda1b7fcaa8eeee7786448eed5e6626cf
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 numbersround(x, n)- Round to n decimal placesfloor(x),ceil(x)- Floor/ceiling functions
String Functions
upper(s),lower(s)- Case conversiontrim(s)- Remove leading/trailing whitespaceformat(s, ...)- String formattingstrsplit(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)
- Options:
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 stringis_number(str)- Check if string is numeric
Table Functions
isArray(t)- Check if table is a sequential arraydump(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}
- Options:
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
v7.4.1
Latest
Languages
Go
87%
Lua
12.6%
Shell
0.4%