19 releases

0.4.2 Dec 19, 2023
0.4.0 Oct 9, 2022
0.3.5 Feb 8, 2022
0.3.3 Nov 19, 2021
0.2.2 Nov 24, 2020

#46 in Text editors

Download history 3/week @ 2023-12-16 13/week @ 2024-02-24 186/week @ 2024-03-09 8/week @ 2024-03-16 6/week @ 2024-03-30

200 downloads per month

Unlicense OR MIT

28KB
608 lines

tests passing

shell-string

Simple CLI to perform common string operations

Usage

shell-string 0.4.2
Cli for common string operations. Takes input from stdin.

USAGE:
    string <SUBCOMMAND>

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

SUBCOMMANDS:
    case          Transform upper- or lowercase
    chars         Prints all chars on separate lines
    distinct      Output the set of input strings without repetitions, in order
    foreach       Applies a command to each line of input. Lines won't get applied as stdin to the command, instead
                  the command may contain the token "__var", which will get substituted with the individual lines
    help          Prints this message or the help of the given subcommand(s)
    interleave    Interleave input and only print every nth line
    length        Returns the length the input string
    line          Pick a single line by linenumber
    map           Maps each line of input to a given command. The input will be supplied as stdin of the command
    replace       Replace all matching words
    reverse       Reverse order of lines
    split         Split up a string by a separator and print the parts on separate lines
    substr        Extract a part of a given string
    template      Useful for templating, replace sections of input with the output of a shell command or script
    trim          Trim whitespace on lines and ignore empty ones

Why does this exists

I'm writing ci pipelines from time to time and manipulating strings, especially templating anything, always is a HUGE pain. Every coworker has his own style solving a problem and when it comes down to string transformation any solution not written by yourself is sheer unmaintainable. This is mostly because there are thousands of ways to do the tasks shell-string does, but this cli makes them very obvious and easy to understand. More than anything I hated finding some solution for file templating over and over again. I wrote shell-string to never again have to think about what the best way of templating a file is. It's always this, period.

Why is shell-string good for templating files?

Because you practically have no restrictions. You need to just drop in some environment variables? Easy, just write {{ echo $MY_VAR }} into the template. Is complex logic needed? You could write {{ console.log(crazyStuff()) }} and you're golden. Just execute with --shell=node. You want to use haskell in your template files? Use --shell=ghci!

The string template command is so powerful, because it doesn't do the heavy lifting itself, like a lot of alternatives do. Instead it relies on using EVRYTHING, you could use in the terminal. You can specify, how a command get's interpreted, be it by ghci, python or sh (which is the default).

Using string template you could even set up your very own workflow for templating files. This is especially useful in CI or when configuring a fresh system.

How does that look?

kind: Deployment
metadata:
  name: {{ echo $GIT_REPO_NAME }}-deployment
  labels:
    deployed: "{{date}}"
    app: {{ echo $GIT_REPO_NAME }}
spec:
  replicas: {{jq .replicas < config.json}}
...
        image: {{node getImageName.js}}
...

Per default sh is used to interpret the command inside {{ and }} and, if these delimeters don't suite your style, that's okay. You can choose any delimiter you fancy. And you should.

How am using a document as a template?

give you have a document deployment.template.yaml and you want to derive a file called deployment.yaml, that's easy. Open a terminal and type

cat deployment.template.yaml | string template > deployment.yaml

which means

  • cat deployment.template.yaml: Print the file deployment.template.yaml
  • | string template: The | means "don't print this in a terminal, pipe it to another programm" and that programm is string in template mode.
  • > deployment.yaml: Write the output of this into a file called deployment.yaml. If the file existed, empty it beforehand.

Installation

Given cargo is installed on your machine execute

cargo install shell-string

To verify your installation worked type string --version. Given your installation was successful you should see the appropriate version number.


if you want the very latest version, check out this repository locally using

git clone https://github.com/nilsmartel/string

and build and install the code using

cd string   # go into the repository
cargo install --path . --force      # use force in case the binary is alread installed

Dependencies

~4MB
~75K SLoC