Read in 5 minutes
Linux Tr Command with Examples
Tr is a command line utility in Linux and Unix systems that translates, deletes and squeezes characters from the standard input and writes the result to the standard output.
tr command is usually used in combination with other commands through piping and can perform operations like removing repeated characters, converting uppercase to lowercase, and basic character replacing and removing.
In this tutorial, we will show you how to use the
tr command through practical examples and detailed explanations of the most common options.
How to Use the Tr Command
The syntax for the
tr command is as follows:
tr OPTION... SET1 [SET2]
tr accepts two sets of characters, usually with the same length and replaces the characters of the first sets with the corresponding characters from the second set.
A SET is basically a string of characters including the special backslash-escaped characters.
In the following example,
tr will replace all characters from the standard input
linuxize by mapping the characters from the first set with the matching ones from the second set.
echo 'linuxize' | tr 'lin' 'red'
tr will replace each occurrence of
The character sets can also be defined using character ranges. For example instead of writing:
echo 'linuxize' | tr 'lmno' 'wxyz'
you can use:
echo 'linuxize' | tr 'l-n' 'w-z'
--complement) option is used
tr will replace all characters that are not in SET1.
In the example below all of the characters that are not in SET1 will be replaced with the last character from SET2:
echo 'linuxize' | tr -c 'li' 'xy'
As you may have noticed the output has one more visible character than the input. This is because the
echo command prints an invisible newline character
\n that is also replaced with
y. To echo a string without a new line use the
--delete) option tells
tr to delete characters specified in SET1.
The command below will delete all of the characters specified in SET1. When deleting characters without squeezing you can specify only one set.
echo 'Linuxize' | tr -d 'liz'
L character will not be deleted because the input includes an uppercase
L while the
l character in the set in lowercase.
--squeeze-repeats) option replaces a sequence of repeated occurrences with the character set in the last SET. In the following example
tr will remove repeated space characters:
echo "GNU \ Linux" | tr -s ' '
GNU \ Linux
When SET2 is used the sequence of the character specified in SET1 is replaced with SET2.
echo "GNU \ Linux" | tr -s ' ' '_'
--truncate-set1) option forces
tr to truncate SET1 to the length of SET2 before doing further processing.
By default, if SET1 is larger than SET2
tr will reuse the last character of SET2. Here is an example:
echo 'Linux ize' | tr 'abcde' '12'
The output will show that the
e character from SET1 is matched with the latest character of SET2, which is
Now use the same command with the
echo 'Linux ize' | tr -t 'abcde' '12'
You can see that in this case the last three characters of the SET1 are removed. SET1 becomes ‘ab’, the same length as SET2.
tr command also allows you to combine its options. For example, the following command will replace all characters except
0 and then it will squeeze the repeated
echo 'Linux ize' | tr -cs 'i' '0'
Tr Command Examples
In this section, we’ll cover a few examples of common uses of the
Convert lower case to upper case
Converting lower case to upper case or reverse is one of the typical use cases of the
[:lower:] matches all lower case characters and
[:upper:] matches all uppercase characters.
echo 'Linuxize' | tr '[:lower:]' '[:upper:]'
Instead of character classes, you can also use ranges:
echo 'Linuxize' | tr 'a-z' 'A-Z'
To convert upper case to lower case simply switch the places of the sets.
Remove all non-numeric characters
The following example will remove all non-numeric characters from the input passed to the
echo "my phone is 123-456-7890" | tr -cd [:digit:]
[:digit:] stands for all digit characters, and by using the
-c option the command removes all non-digit characters. The output will look like this:
Put each word in new line
To put each word in a new line we need to match all non alpha numerical characters and replace them with a new line:
echo 'GNU is an operating system' | tr -cs '[:alnum:]' '\n'
GNU is an operating system
Remove blank lines
To delete the blank lines simply squeeze the repetitive newline characters:
tr -s '\n' < file.txt > new_file.txt
In the command above we are using the redirection symbol
< to pass the content of the
file.txt to the
tr command as input. The redirection
> writes the output of the command to the
$PATH directories on a separate line
$PATH environmental variable is a colon-delimited list of directories that tells the shell which directories to search for executable files when you type a command.
To print each directory on a separate line we need to match the colon (
:) and replace it with the new line:
echo $PATH | tr ':' '\n'
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin
By now you should have a good understanding of how to use the Linux
tr command. Although very useful,
tr can work only with single characters. For more complex pattern matching and string manipulation, you should use