I have a string like AxxBCyyyDEFzzLMN and I want to replace all the occurrences of x, y, and z with _.

How can I achieve this?

I know that echo "$string" | tr 'x' '_' | tr 'y' '_' would work, but I want to do that in one go, without using pipes.

2

5 Answers

echo "$string" | tr xyz _ 

would replace each occurrence of x, y, or z with _, giving A__BC___DEF__LMN in your example.

echo "$string" | sed -r 's/[xyz]+/_/g' 

would replace repeating occurrences of x, y, or z with a single _, giving A_BC_DEF_LMN in your example.

6

Using Bash Parameter Expansion:

orig="AxxBCyyyDEFzzLMN" mod=${orig//[xyz]/_} 
7

You might find this link helpful: .

In general, to replace the first match of $substring with $replacement:

${string/substring/replacement} 

To replace all matches of $substring with $replacement:

${string//substring/replacement} 

EDIT: Note that this applies to a variable named $string.

3

Here is a solution with shell parameter expansion that replaces multiple contiguous occurrences with a single _:

$ var=AxxBCyyyDEFzzLMN $ echo "${var//+([xyz])/_}" A_BC_DEF_LMN 

Notice that the +(pattern) pattern requires extended pattern matching, turned on with

shopt -s extglob 

Alternatively, with the -s ("squeeze") option of tr:

$ tr -s xyz _ <<< "$var" A_BC_DEF_LMN 
read filename ; sed -i 's/letter/newletter/g' "$filename" #letter 

^use as many of these as you need, and you can make your own BASIC encryption

0

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy