18

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

我从

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

但是我在 HP-UX 上遇到的问题并不总是喜欢这样,有时我会得到一个 0 并且$我的字符串中的任何东西都会消失。所以我决定尝试手动进行。

我有以下代码适用于我感兴趣的所有标点符号,除了我似乎无法在我的 sed 中添加方括号“[]”和其他任何东西,否则它不会替换任何东西,而且我没有收到错误,所以我不确定要解决什么。

无论如何,这是我目前拥有并想要添加[]的内容。

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

顺便说一句,我在 Solaris、Redhat 和 HP 上使用 KSH

4

5 回答 5

24

您需要将括号放在表达式的前面:

sed 's/[][=+...-]/ /g'

通过将 ']' 作为第一个字符放在左括号之后,它被解释为字符集的成员,而不是右括号。在括号内的任何位置放置一个“[”使其成为集合的成员。

对于这个特定的字符集,您还需要特别处理,因为您并没有尝试在和-之间构建一系列字符。所以把 放在课程的最后。[=-

于 2012-08-30T19:23:33.550 回答
5

您还可以指定要保留的字符 [with inversion]:

sed 's/[^a-zA-Z0-9]/ /g'
于 2012-08-30T19:26:33.813 回答
3

您可以手动执行此操作:

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

这去掉了 32 个标点字符,一些字符的顺序很重要:

  • -最后应该是这样-]
  • []应该是这样的[][other characters]
  • '应该这样逃脱'\''
  • ^不是以like in开头[^
  • 不以开始[. [= [: 和以结束.] =] :]
  • 不以$]

在这里,您可以解释为什么所有这些 http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_03

于 2016-10-21T01:44:20.727 回答
1

这是我最终得到的最终代码

`echo "$string" | sed 's/[^a-zA-Z0-9]/ /g'`

我不得不把=-放在最后。

于 2012-09-04T15:14:10.483 回答
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
于 2017-04-25T21:22:29.380 回答