如何使用SED替换[]括号

18
我有一个字符串需要去除标点符号。
我开始的代码是:
sed 's/[[:punct:]]/ /g'
但我在HP-UX上遇到一些问题,它并不总是喜欢这样做,有时候我会得到0,并且我的字符串中所有$之后的任何内容都会消失。所以我决定尝试手动处理。
以下是我的代码,它可以处理我感兴趣的所有标点符号,但我似乎无法将方括号 "[]" 添加到我的 sed 中与其他内容一起使用,否则它就不能替换任何内容,我也没有错误提示,因此我不知道该如何解决。
无论如何,这就是我目前的代码,并希望添加 []
sed 's/[-=+|~!@#\$%^&*(){}:;'\'''\"''\`''\.''\/''\\']/ /g'

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


2
你为什么要用sed来做这个?如果要用空格替换一大组字符,最好使用tr - William Pursell
6个回答

27
您需要在表达式的早期放置括号:
sed 's/[][=+...-]/ /g'
通过将 ']' 放置在打开方括号之后的第一个字符位置,它被解释为字符集的成员而不是闭合括号。将 '[' 放置在方括号内的任何位置都会使其成为该集合的成员。
对于这个特定的字符集,您还需要特殊处理 '-',因为您不是要在 '[' 和 '=' 之间构建一系列字符。所以将 '-' 放在类的末尾。

是的...那就是我最初想的,但是当我这样做时,我总是收到无效范围结尾错误 echo word1$word2 | sed 's/[]-=+|~!@#$%^&*(){}:;''''"''`''.''/''\'[]/ /g' sed: -e 表达式#1,第36个字符:无效的范围结尾 - nitrobass24
“无效范围”是由于 - 导致的。当 - 出现在中间时,sed 会尝试创建一个字符范围。请改用 \- - William Pursell
在字符类中,如果要表示破折号,必须将其放在第一个字符位置上,否则它可能被解释为表示字符范围的元字符。 - potong
@potong,- 也可以是集合的最后一个字符。 - glenn jackman
谢谢你的建议...我已经将我的最终结果发布在下面的答案中...我不得不将=也移到正则表达式的末尾才能使其工作。 - nitrobass24

5
您可以使用反转功能来指定您想要保留的字符:
sed 's/[^a-zA-Z0-9]/ /g'

这是我甚至没有意识到可能存在的事情。看起来工作得很好,除了当我的字符串中有"$"时...在"$"之后的任何内容都会被删除。我尝试了 echo word1$word2 | sed 's/[^a-zA-Z0-9]/ /g' ,但我的输出是 word1 - nitrobass24
2
这是shell将$word2解释为变量的结果,可以尝试使用echo 'word1$word2'或者echo word1\$word2来输出。 - perreal
我最终做的是将我的字符串保存为一个变量...然后在双引号内传递该变量。 echo "$string" | sed 's/[^a-zA-Z0-9]/ /g' - nitrobass24

3
您可以手动完成它:
sed 's/[][\/$*.^|@#{}~&()_:;%+"='\'',`><?!-]/ /g'

这会移除32个标点符号,某些字符的顺序很重要:

  • - 应该在结尾,如 -]
  • [] 应该像这样 [][其他字符]
  • ' 应该转义为 '\''
  • 不能以 ^ 开始,如 [^
  • 不能以 [. [= [: 开始,以 .] =] :] 结束
  • 不能以 $] 结束

这里可以解释为什么需要这样做:http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_03


1

这是我最终得出的代码

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

我必须在最后放置=-


1

如果您需要完全替换括号及其内容,则需要进行转义。例如下面的示例,将整个括号以及冒号替换为:

echo "listen [::]:8080 default_server" sed -i 's|listen \[::\]:8080 default_server|listen       8080|' filename.txt

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接