用 sed 替换一个以上的特殊字符

replace more than one special character with 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'))

所以这会将所有空格替换为 -,但是替换其他空格的正确表达式是什么?我通过 google 进行的一次搜索不是很成功。

显然您想删除 -.,然后用 -.

替换空格

这样就可以了,说 sed -e 'one thing' -e 'another thing':

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

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

这样做对你有帮助吗:

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

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

获取变量

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

这取决于您认为什么是特殊字符 -- 我这样说是因为您似乎认为 & 是常规字符而不是 .,这似乎有点奇怪。无论如何,我想象的形式

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

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

另请注意,如果 $name 以连字符开头(它可以被解析为 echo 的选项),echo 可能 会造成麻烦, 所以如果你能把自己拴在 bash,

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

可能更稳健。

也试试这个方法

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

输出:

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