如何从字符串中删除特殊字符,但在shell脚本中保留下划线

时间:2016-05-06 16:15:29

标签: bash shell

我有一个类似“info_A!__ B ???????? C_ *”的字符串。我想删除它中的特殊字符,但保留下划线和字母。我尝试使用[:word:](ASCII字母和_)字符集,但它说“无效字符集”。任何想法如何处理这个?感谢。

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

4 个答案:

答案 0 :(得分:5)

使用 (: every? : (All (A) (A -> Boolean) (Listof A) -> Boolean)) 参数扩展:

bash

答案 1 :(得分:1)

sed单行将是

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

给你

info_

awk单行将

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

给你

info_A_pi9ngo_mingo745

如果您不希望在输出中包含数字,请将:alnum:更改为:alpha:

答案 2 :(得分:1)

我的tr无法理解[:word:]。我不得不这样做:

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

答案 3 :(得分:1)

不确定它是否具有强大的方式,但它适用于您的示例文本。

sed one-liner:

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