如何使用SED替换[]括号

时间:2012-08-30 19:20:18

标签: shell replace sed ksh brackets

我有一个字符串,我想删除标点符号。

我从

开始
sed 's/[[:punct:]]/ /g'

但我在HP-UX上遇到的问题一直不喜欢,有时我会得到一个0,并且在我的字符串中$之后的任何内容都会消失。所以我决定尝试手动完成。

我有以下代码可以处理我感兴趣的所有标点符号,除了我似乎无法用其他任何内容添加方括号“[]”到我的sed,否则它不会替换任何东西,我不会得到错误,所以我不确定要修复什么。

无论如何,这是我目前所拥有的,并希望将[]添加到。

sed 's/[-=+|~!@#\$%^&*(){}:;'\'''\"''\`''\.''\/''\\']/ /g'

BTW我在Solaris上使用KSH,Redhat& HP

5 个答案:

答案 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