用 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
我是正则表达式的菜鸟,所以我对 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