我有一个字符串,我想从中删除标点符号。
我开始于
sed 's/[[:punct:]]/ /g'
但是我在 HP-UX 上遇到了问题,不喜欢这样,有时我会得到一个 0,字符串中
$
之后的任何内容都会消失。所以我决定尝试手动完成。
我有以下代码,适用于我感兴趣的所有标点符号,除了我似乎无法使用其他任何内容向我的 sed 添加方括号“[]”,否则它不会替换任何内容,并且我不会收到错误,所以我不确定要修复什么。
无论如何,这就是我目前拥有的并且想添加
[]
。
sed 's/[-=+|~!@#\$%^&*(){}:;'\'''\"''\`''\.''\/''\\']/ /g'
顺便说一句,我在 Solaris、Redhat 和 HP 上使用 KSH
您需要将括号放在表达式的前面:
sed 's/[][=+...-]/ /g'
通过将“]”作为紧接在左括号之后的第一个字符,它将被解释为字符集的成员而不是右括号。 将“[”放置在括号内的任意位置使其成为该集合的成员。
对于这个特定的字符集,您还需要专门处理
-
,因为您并不试图在 [
和 =
之间构建一系列字符。 因此,请将 -
放在课程末尾。
您还可以指定要保留的字符[带反转]:
sed 's/[^a-zA-Z0-9]/ /g'
您可以手动完成:
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]
^
那样以
[^
[.
[=
[:
开头并以 .]
=]
:]
$]
!
%
应该这样转义%%
"
应该这样转义""
这是我最终得到的代码
`echo "$string" | sed 's/[^a-zA-Z0-9]/ /g'`
我必须把
=
和-
放在最后。
如果您需要将括号与内容一起完全替换,那么您需要将其转义。例如下面的例子,将整个括号与冒号一起替换
echo "listen [::]:8080 default_server" sed -i 's|listen \[::\]:8080 default_server|listen 8080|' filename.txt
也可以使用正则表达式捕获技术来处理(例如:下面):
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