WOODY'S
FINDINGS

Command examples

Use these commands with the People files in the Playground. The commands work regardless of the file format you choose with the -i | --input option: People.json, People.plist, People.yml or People.xml. The JSON version is provided below.

Summary


Here is the JSON version of the People files:
{
  "Tom" : {
    "age" : 68,
    "hobbies" : [
      "cooking",
      "guitar"
    ],
    "height" : 175
  },
  "Robert" : {
    "age" : 23,
    "hobbies" : [
      "video games",
      "party",
      "tennis"
    ],
    "running_records" : [
      [
        10,
        12, 9,
        10
      ],
      [ 9,
        12,
        11
      ]
    ],
    "height" : 181
  },
  "Suzanne" : {
    "job" : "actress",
    "movies" : [
      {
        "title" : "Tomorrow is so far",
        "awards" : "Best speech for a silent movie"
      },
      {
        "title" : "Yesterday will never go",
        "awards" : "Best title"
      },
      {
        "title" : "What about today?"
      }
    ]
  }
}

Read

Output Tom's height: 175

scout read "Tom.height" -i People.json -f json

Output Tom's first hobby: cooking

scout read "Tom.hobbies[0]" -i People.xml -f xml

Output Tom's last hobby: guitar

scout read "Tom.hobbies[-1]" -i People.xml -f xml

Output Suzanne first movie title: Tomorrow is so far

scout read "Suzanne.movies[0].title" -i People.yml -f yaml

Output Suzanne second movie title from the end: "Yesterday will never go"

scout read "Suzanne.movies[-2].title" -i People.yml -f yaml

Output Robert running records second record first value: 9

scout read "Robert.running_records[1][0]" -i People.json -f json

The following:

scout read "Tom" -i People.json -f json

outputs Tom dictionary:

{
  "age" : 68,
  "hobbies" : [
    "cooking",
    "guitar"
  ],
  "height" : 175
}

Get dictionary or array count

Get a dictionary or an array count with the [#] symbol.

Get people count: 3

scout read "[#]" -i People.plist

Get Suzanne's movies count: 3

scout read "Suzanne.movies[#]" -i People.xml -f xml

Get a dictionary keys

You can list a dictionary's keys with the {#} symbol. The keys are returned as an array.

Get Tom dictionary keys list

scout read -i People.yml -f yaml "Tom{#}"

Useful to iterate over a dictionary with the --csv-sep export option:

keys=(`scout read -i People.json -f json "Tom{#}" —csv-sep " "`)

for key in $keys;  do
    scout read -i People.json -f json ”Tom.$key";
done

Get a group sample

Array slicing

Get Robert first two hobbies

scout read -i People.json -f json "Robert.hobbies[:1]"

Get Robert last two hobbies

scout read -i People.yml -f yaml "Robert.hobbies[-2:]"

Get Suzanne movies titles

scout read -i People.plist -f plist "Suzanne.movies[:].title"

Dictionary filtering

Get Tom keys beginning by "h"

scout read -i People.json -f json "Tom.#h.*#"

Get Tom and Robert hobbies

scout read -i People.xml -f xml "#Tom|Robert#.hobbies"

Mixing slicing and filtering

Get Tom and Robert first two hobbies

scout read -i People.yml -f yaml "#Tom|Robert#.hobbies[:1]"


Set

Set Robert age to: 60

scout set "Robert.age=60" -i People.plist -f plist

Set Suzanne second movie title to: "Never gonna die"

scout set "Suzanne.movies[1].title"="Never gonna die" -i People.yml -f yaml

Set Tom last hobby to "play music". Set Suzanne job to: comedian.

scout set \
"Tom.hobbies[-1]=play music" \
"Suzanne.job=comedian" \
-i People.plist

Set Robert running records first record third value to: 15

scout set "Robert.running_records[0][2]=15" -i People.xml -f xml

Set Tom height to the String value: 165

scout set "Tom.height=/165/" -i People.json -f json

Set Tom height to the Real value: 165 (only useful for Plist files)

scout set "Tom.height=~165~" -i People.plist -f plist

Set Tom height key name to "centimeters"

scout set "Tom.height=#centimeters#" -i People.json  -f json


Delete

Delete Robert second hobby: party

scout delete "Robert.hobbies[1]" -i People.xml -f xml

Delete Tom last hobby and Suzanne second movie awards

scout delete \
"Tom.hobbies[-1]" \
"Suzanne.movies[1].awards" \
-i People.json

Delete Robert hobbies array

scout delete "Robert.hobbies" -i People.yml -f yaml

Delete all Tom hobbies and recursively the hobbies array

scout delete "Tom.hobbies[:]" -ir People.yml -f yaml

Delete a group sample

Array slicing

Delete Robert first two hobbies

scout delete -i People.json -f json "Robert.hobbies[:1]"

Delete Robert last two hobbies

scout delete -i People.xml -f xml "Robert.hobbies[-2:]"

Delete Suzanne movies titles

scout delete -i People.plist -f plist "Suzanne.movies[:].title"

Delete Suzanne movies titles and remove the last movie element as it only as a "title" key with the -r|--recursive flag

scout delete -ir People.plist "Suzanne.movies[:].title"

Dictionary filtering

Delete Tom keys beginning by "h";

scout delete -i People.xml -f xml "Tom.#h.*#"

Delete Tom and Robert hobbies

scout delete -i People.plis -f plist "#Tom|Robert#.hobbies"

Mixing slicing and filtering

Delete Tom and Robert first two hobbies

scout delete -i People.json -f json "#Tom|Robert#.hobbies[:1]"

Delete Tom and Robert first two hobbies and Tom hobbies key recursively

scout delete -ir People.json -f json "#Tom|Robert#.hobbies[:1]"


Add

Add a surname for Robert: Bob

scout add "Robert.surname"=Bob -i People.xml -f xml

Add a movie to Suzanne's movies with the title: "Never gonna die"

scout add "Suzanne.movies[#].title"="Never gonna die" -i People.json

Add a new surname for Robert: Bob. Add a new hobby for Tom at the end of the hobbies array: sleeping.

scout add \
"Robert.surname=Bob" \
"Tom.hobbies[#]=sleeping" \
-i People.plist -f plist

Add a new value at the end of the array to Robert running records second record

scout add "Robert.running_records[1][#]"=20 -i People.yml

Add a new record to Robert running records and add a new value into it: 15

scout add \
"Robert.running_records[#]=[]" \
"Robert.running_records[-1][0]=15" \
-i People.json -f json

Add a new String value at the end the array to Robert running records first record

scout add "Robert.running_records[0][#]=/15/" -i People.plist -f plist

List paths

List all the paths in the file People.plist.

scout paths -i People.plist -f plist

Output:
Robert
Robert.age
Robert.height
Robert.hobbies
Robert.hobbies[0]
Robert.hobbies[1]
Robert.hobbies[2]
Robert.running_records
Robert.running_records[0]
Robert.running_records[0][0]
Robert.running_records[0][1]
Robert.running_records[0][2]
Robert.running_records[0][3]
Robert.running_records[1]
Robert.running_records[1][0]
Robert.running_records[1][1]
Robert.running_records[1][2]
Suzanne
Suzanne.job
Suzanne.movies
Suzanne.movies[0]
Suzanne.movies[0].awards
Suzanne.movies[0].title
Suzanne.movies[1]
Suzanne.movies[1].awards
Suzanne.movies[1].title
Suzanne.movies[2]
Suzanne.movies[2].title
Tom
Tom.age
Tom.height
Tom.hobbies
Tom.hobbies[0]
Tom.hobbies[1]

Target single or group values

List all the paths leading to single values in the file People.xml.

scout paths -i People.xml -f xml --single
Output:
Robert.age
Robert.height
Robert.hobbies[0]
Robert.hobbies[1]
Robert.hobbies[2]
Robert.running_records[0][0]
Robert.running_records[0][1]
Robert.running_records[0][2]
Robert.running_records[0][3]
Robert.running_records[1][0]
Robert.running_records[1][1]
Robert.running_records[1][2]
Suzanne.job
Suzanne.movies[0].awards
Suzanne.movies[0].title
Suzanne.movies[1].awards
Suzanne.movies[1].title
Suzanne.movies[2].title
Tom.age
Tom.height
Tom.hobbies[0]
Tom.hobbies[1]

List all the paths leading to group values in the file People.xml.

scout paths -i People.xml -f xml --group
Output:
Robert
Robert.hobbies
Robert.running_records
Robert.running_records[0]
Robert.running_records[1]
Suzanne
Suzanne.movies
Suzanne.movies[0]
Suzanne.movies[1]
Suzanne.movies[2]
Tom
Tom.hobbies

Initial path

List all the paths in the file People.yml in Robert dictionary.

scout paths "Robert" -i People.yml -f xml
Output:
Robert.age
Robert.height
Robert.hobbies
Robert.hobbies[0]
Robert.hobbies[1]
Robert.hobbies[2]
Robert.running_records
Robert.running_records[0]
Robert.running_records[0][0]
Robert.running_records[0][1]
Robert.running_records[0][2]
Robert.running_records[0][3]
Robert.running_records[1]
Robert.running_records[1][0]
Robert.running_records[1][1]
Robert.running_records[1][2]


List all the paths in the file People.yml in Robert and Tom dictionary.

scout paths -i People.yml -f yaml "#Robert|Tom#"
Output:
Robert
Robert.age
Robert.height
Robert.hobbies
Robert.hobbies[0]
Robert.hobbies[1]
Robert.hobbies[2]
Robert.running_records
Robert.running_records[0]
Robert.running_records[0][0]
Robert.running_records[0][1]
Robert.running_records[0][2]
Robert.running_records[0][3]
Robert.running_records[1]
Robert.running_records[1][0]
Robert.running_records[1][1]
Robert.running_records[1][2]
Tom
Tom.age
Tom.height
Tom.hobbies
Tom.hobbies[0]
Tom.hobbies[1]


List all the paths leading to Suzanne's movies titles in the file People.yml.

scout paths -i People.yml -f yaml "Suzanne.movies[:].title"
Output:
Suzanne.movies[0].title
Suzanne.movies[1].title
Suzanne.movies[2].title


Filter the keys

List all the paths leading to a key "hobbies" in the file People.json.

scout paths -i People.json -f json -k "hobbies"
Output:
Robert.hobbies
Robert.hobbies[0]
Robert.hobbies[1]
Robert.hobbies[2]
Tom.hobbies
Tom.hobbies[0]
Tom.hobbies[1]


List all the paths leading to a key starting with "h" in the file People.json.

scout paths -i People.json -f json-k "h.*"
Output:
Robert.height
Robert.hobbies
Robert.hobbies[0]
Robert.hobbies[1]
Robert.hobbies[2]
Tom.height
Tom.hobbies
Tom.hobbies[0]
Tom.hobbies[1]


Filter the values

List the paths whose value is below 70.

scout paths -i People.plist -f plist -v "value < 70"
Output:
Robert.age
Robert.running_records[0][0]
Robert.running_records[0][1]
Robert.running_records[0][2]
Robert.running_records[0][3]
Robert.running_records[1][0]
Robert.running_records[1][1]
Robert.running_records[1][2]
Tom.age


List the paths whose value is greater than or equal to 20 and lesser than 70.

scout paths -i People.plist -f plist -v "value >= 20 && value < 70"
Output:
Robert.age
Tom.age


List the paths whose value starts with "guit" (case sensitive).

scout paths -i People.json -f json -v "value hasPrefix 'guit'"
Output:
Tom.hobbies[1]


List the paths whose value starts with "guit" or are greater than 20 (case sensitive).

scout paths -i People.json -f json -v "value hasPrefix 'guit'" -v "value > 20"
Output:
Robert.age
Robert.height
Tom.age
Tom.height
Tom.hobbies[1]


Mixing up

List paths leading to Robert hobbies that contain the word "game".

scout paths -i People.yml -f yaml "Robert.hobbies" -v "value contains 'games'"
Output:
Robert.hobbies[0]


List paths leading to Robert or Tom hobbies array (group values).

scout paths -i People.yml -f yaml "#Tom|Robert#" -k "ho.*" --group
Output:
Robert.hobbies
Tom.hobbies

List paths leading to Suzanne's movies titles that contains the word "today".

scout paths -i People.json -f json "Suzanne.movies[:].title" -v "value contains 'today'"
Output:
Suzanne.movies[2].title