sed 删除行中的特殊字符和空格

sed 删除行中的特殊字符和空格

输入

[*] 111, 22, 33, 44

输出

111,22,33,44

使用sed命令sed 's/^\[\*\][[:space:]]*//' file能够显示输出,111, 22, 33, 44这意味着空间仍然存在。

那么正确的命令是什么呢sed

答案1

简短的答案是,这应该做你想要的:

sed 's/[][*]\|[[:space:]]//g'

像这样测试一下:

echo '[*] 111, 22, 33, 44' | sed 's/[][*]\|[[:space:]]//g'

输出:

111,22,33,44

下面是更长的解释。


你的表达缺少的关键要素是使用命令g执行全局替换。如果没有此命令,则只会替换每行的第一个匹配项。

我的解决方案中最违反直觉的一点(在我看来)是如何将方括号包含在字符类中。为此,我们参考sed手册

‘]’
    ends the bracket expression if it’s not the first list item.
    So, if you want to make the ‘]’ character a list item, you must put it first.

有关该主题的进一步讨论,请参阅以下有关 SeverFault 的帖子:

或者,您可以将表达式传递到另一个sed命令中,例如:

echo '[*] 111, 22, 33, 44' \
| sed 's/^\[\*\]//' \
| sed 's/[[:space:]]//g'

相关内容