如何使用 SED 替换 [] 括号

问题描述 投票:0回答:6

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

我开始于

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

但是我在 HP-UX 上遇到了问题,不喜欢这样,有时我会得到一个 0,字符串中

$
之后的任何内容都会消失。所以我决定尝试手动完成。

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

无论如何,这就是我目前拥有的并且想添加

[]

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

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

shell replace sed ksh brackets
6个回答
30
投票

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

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

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

对于这个特定的字符集,您还需要专门处理

-
,因为您并不试图在
[
=
之间构建一系列字符。 因此,请将
-
放在课程末尾。


5
投票

您还可以指定要保留的字符[带反转]:

sed 's/[^a-zA-Z0-9]/ /g'

3
投票

您可以手动完成:

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

这删除了 32 个标点符号,一些字符的顺序很重要:

  • -
    最后应该是这样的
    -]
  • []
    应该是这样的
    [][other characters]
  • '
    应该这样转义
    '\''
  • 不像
    ^
    那样以 
    [^
  • 开头
  • 不以
    [.
    [=
    [:
    开头且不以
    .]
    =]
    :]
  • 结束
  • 不以
    $]
  • 结尾

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


提示:

对于从 cmd 使用的 cygwin,公式稍有变化:

sed "s/[][\/$*.^|@#{}_~&():;%%+""=',`><?^^^!-]/ /g"
  • 应该用
    "
    而不是
    '
  • 来引用
  • -
    最后应该是这样的
    -]
  • []
    应该是这样的
    [][other characters]
  • 不像
    ^
    那样以 
    [^
  • 开头
  • 不以
    [.
    [=
    [:
    开头并以
    .]
    =]
    :]
  • 结束
  • 不以
    $]
  • 结尾 如果使用延迟扩展
  • ,则应转义
    !
  • %
    应该这样转义
    %%
  • "
    应该这样转义
    ""

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
© www.soinside.com 2019 - 2024. All rights reserved.