Banner of None

Everything you need to know about strings manipulation in Bash

Category: Shell Scripting

Date: August 2020
Views: 1.86K

One of the best things in Bash is the extensive tools we can use to manipulate strings. you can extract substrings , replace or delete them, and do much more.
This will be our string to manipulate for this tutorial:

#   0123456789.....
#   0-based indexing.

Get Length of string

echo ${#str}        #42

Get 5 chars starting from 0

echo ${str:0:5}      # /home

Get everything after the 5th char

echo ${str:5}      # /mosaid/Documents/Bash/

backward positioning: get the last 14 chars

we use parentheses or a space to delimit the negative sign for the position parameter when we are backward positioning:

echo ${str:(-14)}      #
echo ${str: -14}       #

substrings: forward search

remove everything before ( including ) the first occurrence of "Bash" :

echo ${str#*Bash}      # /

remove everything untill (and including) the last occurrence of "Bash" :

echo ${str##*Bash}      #

we can use the same to extract the extension: remove everything until the last dot "."
or to extract the file name from the path by removing everything untill the last "/":

echo ${str##*.}      # sh
echo ${str##*/}      #

substrings: backward search

starting from the end remove everything after (including) the word "Bash":

echo ${str%Bash*}      # /home/mosaid/Documents/Bash/

we can use it to extract the directory path :
starting from the end, removing everything after the first occurrence of "/"

echo ${str%%/*}      # /home/mosaid/Documents/Bash/

substrings: replace

first example : replace the first occurrence of "Bash" with "Shell Scripting"
second example: replace all occurrences of "Bash" with "Shell"

echo ${str/Bash/Shell Scripting}    # /home/mosaid/Documents/Shell Scripting/
echo ${str//Bash/Shell}             # /home/mosaid/Documents/Shell/

if we want to use the backward slash "/" as a pattern we need to escape it with a forward slash "\":
replace all "/" with "@"

echo ${str//\//@}       #

we can make some/all chars uppercase or lowercase:

str="Hello, Welcome to LINUX, Bash strings"

#convert the first char to uppercase
echo ${str^}

#convert all chars to uppercase
echo ${str^^}

#convert the characters c,s and m to uppercase
echo ${str^^[csm]}

#convert the first char to lowercase
echo ${str,}

#convert all chars to lowercase
echo ${str,,}

#convert the characters N,U and S to lowercase
echo ${str,,[NUS]}

delimit string and divide it into variables

Here, the delimitter (separator) is the comma ,

str="Hello, Welcome to LINUX, Bash strings"

IFS=, read -r x y z <<< "$str"

echo x = $x         # Hello
echo y = $y         # Welcome to LINUX
echo z = $z         # Bash strings

delimit string and divide it into an array

str="Hello, Welcome to LINUX, Bash strings"

IFS=, read -ra arr <<< "$str"

echo ${arr[0]}         # Hello
echo ${arr[1]}         # Welcome to LINUX
echo ${arr[2]}         # Bash strings

With these tools we can manipulate our strings in any way we want, however we might face a situation much complicated where these native Bash strings manipulation tools will not be sufficient, at this point we can use some much more powerful commands like sed or awk.


Previous Article Next Article

0 Comments, latest

No comments.