jlp
jlp

Reputation: 1706

How to remove special characters from strings but keep underscores in shell script

I have a string that is something like "info_A!__B????????C_*". I wan to remove the special characters from it but keep underscores and letters. I tried with [:word:] (ASCII letters and _) character set, but it says "invalid character set". any idea how to handle this ? Thanks.

text="info_!_????????_*"
if [ -z `echo $text | tr -dc "[:word:]"` ]
......

Upvotes: 1

Views: 4360

Answers (4)

monk
monk

Reputation: 2115

Not sure if its robust way but it worked for your sample text.

sed one-liner:

echo "SamPlE_@tExT%, really ?" | sed -e 's/[^a-z^A-Z|^_]//g'
SamPlE_tExTreally

Upvotes: 1

totoro
totoro

Reputation: 2456

My tr doesn't understand [:word:]. I had to do like this:

$ x=$(echo 'info_A!__B????????C_*' | tr -cd '[:alnum:]_')
$ echo $x
info_A__BC_

Upvotes: 1

sjsam
sjsam

Reputation: 21965

A sed one-liner would be

sed 's/[^[:alnum:]_]//g' <<< 'info_!????????*'

gives you

info_

An awk one-liner would be

awk '{gsub(/[^[:alnum:]_]/,"",$0)} 1' <<< 'info_!??A_??????*pi9ngo^%$_mingo745'

gives you

info_A_pi9ngo_mingo745

If you don't wish to have numbers in the output then change :alnum: to :alpha:.

Upvotes: 1

heemayl
heemayl

Reputation: 42007

Using bash parameter expansion:

$ var='info_A!__B????????C_*'

$ echo "${var//[^[:alnum:]_]/}"
info_A__BC_

Upvotes: 6

Related Questions