A common problem when writing shell scripts is to swap suffixes for file names. For example, I wanted to translate a batch of markdown files to html but also to apply a sed script so I could get curly quotes and long dashes etc. To do that I needed to create a temporary file, so I had to go from file.md to file.tmp to file.html. Each time I needed to swap suffixes. Having looked around I couldn't find a neat way to do that, and most of them used expr, which starts a new process. I wanted to do it natively in bash or even dash (the default Ubuntu shell). So I wrote a trivial but neat function and a test, which can be stripped out. The function is all you need:
#!/bin/bash string="banana.md" function swap { echo "${1:0:(${#1}-(${#2}+1))}.$3" } swap "banana.md" "md" "tmp"
To use it in a real script just use backticks thus:
... function swap { echo "${1:0:(${#1}-(${#2}+1))}.$3" } markdown myfile.md > `swap "myfile.md" "md" "html"` ...