To split a string on a delimiter in Bash, you can use several methods depending on your needs. Here are the most common approaches:
1. Split into an Array with read
and IFS
Set the Internal Field Separator (IFS
) to your delimiter and use read -ra
to split the string into an array.
Example: Split on commas (,
):
string="apple,banana,cherry"
IFS=',' read -ra arr <<< "$string"
# Access elements
echo "${arr[0]}" # Output: apple
echo "${arr[1]}" # Output: banana
echo "${#arr[@]}" # Output: 3 (number of elements)
2. Split with Parameter Expansion
Replace the delimiter with a space and convert the string into an array:
string="one:two:three"
delimiter=":"
arr=(${string//$delimiter/ }) # Replace delimiter with spaces
echo "${arr[2]}" # Output: three
Note: This works only if the string does not contain spaces.
3. Use awk
for Advanced Splitting
For multi-character delimiters or field extraction:
string="name|age|city"
echo "$string" | awk -F'|' '{print $2}' # Output: age
4. Split with tr
and Process Line-by-Line
Convert the delimiter to newlines and iterate:
string="dog;cat;bird"
echo "$string" | tr ';' '\n' | while read -r item; do
echo "Item: $item"
done
Output:
Item: dog
Item: cat
Item: bird
5. Extract Specific Fields with cut
Get the nth field (e.g., 2nd field):
string="red,green,blue"
echo "$string" | cut -d',' -f2 # Output: green
Key Notes
- Delimiters with Special Characters: Escape them (e.g.,
IFS=$'\t'
for tabs). - Empty Elements: Leading/trailing delimiters create empty array elements (e.g.,
",a,b,"
splits into""
,"a"
,"b"
,""
). - Multi-Character Delimiters: Use
awk
orsed
(e.g.,awk -F'::' '{...}'
).
Full Example: Split and Iterate
# Split a CSV string into an array
csv="item1,item2,item3"
IFS=',' read -ra items <<< "$csv"
for item in "${items[@]}"; do
echo "Processing: $item"
done
Output:
Processing: item1
Processing: item2
Processing: item3
Edge Cases
- Handle Empty Strings:
string=",,apple,,"
IFS=',' read -ra arr <<< "$string"
echo "${#arr[@]}" # Output: 5 (includes empty elements)
- Trim Whitespace (if needed):
string=" apple , banana "
IFS=',' read -ra arr <<< "$string"
# Trim spaces for each element
arr=("${arr[@]// /}") # Remove all spaces
Use these methods to split strings for parsing CSV, paths (e.g., $PATH
), or configuration data!