我有一个字符串,我想删除标点符号。
我从
开始sed 's/[[:punct:]]/ /g'
但我在HP-UX上遇到的问题一直不喜欢,有时我会得到一个0,并且在我的字符串中$
之后的任何内容都会消失。所以我决定尝试手动完成。
我有以下代码可以处理我感兴趣的所有标点符号,除了我似乎无法用其他任何内容添加方括号“[]”到我的sed,否则它不会替换任何东西,我不会得到错误,所以我不确定要修复什么。
无论如何,这是我目前所拥有的,并希望将[]
添加到。
sed 's/[-=+|~!@#\$%^&*(){}:;'\'''\"''\`''\.''\/''\\']/ /g'
BTW我在Solaris上使用KSH,Redhat& HP
答案 0 :(得分:21)
您需要在表达式的前面放置括号:
sed 's/[][=+...-]/ /g'
通过将']'作为第一个字符放在开括号之后,它被解释为字符集的成员而不是结束括号。在括号内放置'['使其成为集合的成员。
对于此特定字符集,您还需要特别处理-
,因为您没有尝试在[
和=
之间构建一系列字符。所以把-
放在课程的最后。
答案 1 :(得分:4)
您还可以指定要保留[使用反转]的字符:
sed 's/[^a-zA-Z0-9]/ /g'
答案 2 :(得分:2)
您可以手动执行此操作:
sed 's/[][\/$*.^|@#{}~&()_:;%+"='\'',`><?!-]/ /g'
这删除了32个标点符号,一些字符的顺序很重要:
-
应该像-]
[]
应该与[][other characters]
'
应该像'\''
^
[^
开头
[.
[=
[:
开头,而是以.]
=]
:]
$]
在这里,您可以解释为什么http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_03
答案 3 :(得分:1)
以下是我最终的代码
`echo "$string" | sed 's/[^a-zA-Z0-9]/ /g'`
我必须将=
和-
放在最后。
答案 4 :(得分:0)
也可以使用正则表达式捕获技术处理(例如:下面):
echo "narrowPeak_SP1[FLAG]" | sed -e 's/\[\([a-zA-Z0-9]*\)\]/_\1/g'
> narrowPeak_SP1_FLAG
\[ : literal match to open square bracket, since [] is a valid regex
\] : literal match to square close bracket
\(...\) : capture group
\1 : represents the capture group within the square brackets