用sed替换多个特殊字符

时间:2015-01-29 13:18:09

标签: regex bash sed

我是正则表达式中的一个小说,所以我对sed头疼。 我需要帮助用“ - ”替换给定公司名称中的所有特殊字符。

所以这是给定的字符串:

FML Finanzierungs- und Mobilien Leasing GmbH & Co. KG

我想要结果:

FML-Finanzierungs-und-Mobilien-Leasing-GmbH-&-Co-KG

我尝试了以下内容:

nr = $(echo "$name" | sed -e 's/ /-/g'))

所以这用-替换所有空格,但用什么正确的表达式替换其他空格?我通过谷歌搜索的不是很成功。

4 个答案:

答案 0 :(得分:2)

这取决于你认为是一个特殊的角色 - 我说这是因为你似乎认为&是一个普通角色而不是.,这看起来有点奇怪。无论如何,我想象一下形式

nr=$(echo "$name" | sed 's/[^[:alnum:]&]\+/-/g')

会为你提供最好的服务。此处[^[:alnum:]&]匹配任何非字母数字或&的字符,[^[:alnum:]&]\+匹配一个或多个此类字符的序列,因此sed调用会替换$name调用中的所有此类序列带有连字符的{1}}如果您认为其他字符是常规字符,请将它们添加到集合中。请注意,对变音符号等的处理取决于您的语言环境。

另请注意,如果echo以连字符开头(可以将其解析为$name的选项),echo 可能会造成麻烦,所以如果可以的话将自己束缚到bash

nr=$(sed 's/[^[:alnum:]&]\+/-/g' <<< "$name")

可能更强大。

答案 1 :(得分:1)

显然您要删除-.,然后用-替换空格。

这可以通过说sed -e 'one thing' -e 'another thing'

来实现
$ echo "$name" | sed -e 's/[-\.]//g' -e 's/ /-/g'
FML-Finanzierungs-und-Mobilien-Leasing-GmbH-&-Co-KG

请注意,我们会在方括号内附上我们要平等对待的所有字符:[-\.]表示-.(我们需要将其转义,否则它会匹配任何字符)。

答案 2 :(得分:1)

这样做可以帮到你:

awk -vOFS=- '{gsub(/[.-]/,"");$1=$1}1' <<< "$name"
FML-Finanzierungs-und-Mobilien-Leasing-GmbH-&-Co-KG

gsub(/[.-]/,"")删除._
-vOFS=-将新字段分隔符设置为-
$1=$1重建该行,以便使用新的字段分隔符
1打印该行。

将其变为变量

nr=$(awk -vOFS=- '{gsub(/[.-]/,"");$1=$1}1' <<< "$name")

答案 3 :(得分:1)

也尝试这种方式

echo "name" | sed 's/ \|- \|\. /-/g'

OutPut:

FML-Finanzierungs-und-Mobilien-Leasing-GmbH-&-Co-KG